static __s32 camera_init_module_list(__u32 camera_list_size) { __u32 i; detect_print("camera_list_size: %d \n", camera_list_size); for (i = 0; i < camera_list_size; i++) { if (camera_sub_name_exist("camera_list_para", camera_list[i].name)) { camera_list[i].need_detect = TRUE; detect_print("modules: %s need detect!!\n", camera_list[i].name); } } return 0; }
static __s32 camera_diff_i2c_id_detect(__camera_detector_t *camera_detector, __camera_list_t *camera_list, __u32 camera_list_size) { __u32 i, j; __u32 camera_detected = 0; __s32 ret = 0; detect_print("camera_diff_i2c_id_detect!!\n"); for (i = 0; i < camera_detector->num; i++) { for (j = 0; j < camera_list_size; j++) { if (camera_list[j].need_detect) { camera_list[j].pwr_on(j, &camera_detector->camera[i]); ret = camera_list[j].detect(j, camera_detector->camera[i].i2c_adap); if (ret == 0) { camera_list[j].pwr_off(j, &camera_detector->camera[i]); strcpy(camera_detector->camera[i].name, camera_list[j].name); camera_detector->camera[i].i2c_addr = camera_list[j].i2c_addr; camera_detected++; break; } } } } if (camera_detector->num != camera_detected) { camera_err("detect camera fail in func: camera_diff_i2c_id_detect !!\n"); return -EDETECTFAIL; } return 0; }
static __s32 camera_mclk_open(__camera_detector_t *camera_detector) { __u32 i, csi_cnt = 0; detect_print("camera_mclk_open !!\n"); if (camera_sub_name_exist("csi0_para", "csi_used")) { csi_cnt++; } if (camera_sub_name_exist("csi1_para", "csi_used")) { csi_cnt++; } for (i = 0; i < csi_cnt; i++) { camera_request_clk(i, &camera_detector->camera[i].module_clk, &camera_detector->camera[i].clk_src, &camera_detector->camera[i].clk_pin_hdle); } if ((csi_cnt == 1) && (camera_detector->num == 2)) { camera_detector->camera[1].module_clk = camera_detector->camera[0].module_clk; } return 0; }
void camera_mclk_close(__camera_detector_t *camera_detector) { detect_print("camera_mclk_close !!\n"); if (camera_detector->camera[0].module_clk != NULL) { camera_release_clk(camera_detector->camera[0].module_clk); } if (camera_detector->camera[1].module_clk != NULL) { camera_release_clk(camera_detector->camera[1].module_clk); } }
__s32 camera_get_sysconfig(char *main_name, char *sub_name, __s32 *buf, __u32 cnt) { script_item_u val; script_item_value_type_e type; int ret = -1; if(cnt == 1) { type = script_get_item(main_name, sub_name, &val); if(SCIRPT_ITEM_VALUE_TYPE_INT == type) { ret = 0; *buf = val.val; detect_print("%s.%s=%d\n", main_name, sub_name, *buf); } else { ret = -1; detect_print("fetch script data %s.%s fail\n", main_name, sub_name); } } else if(cnt == sizeof(__camera_gpio_set_t)/sizeof(__s32)) { type = script_get_item(main_name, sub_name, &val); if(SCIRPT_ITEM_VALUE_TYPE_PIO == type) { __camera_gpio_set_t *gpio_info = (__camera_gpio_set_t *)buf; ret = 0; gpio_info->gpio = val.gpio.gpio; gpio_info->mul_sel = val.gpio.mul_sel; gpio_info->pull = val.gpio.pull; gpio_info->drv_level = val.gpio.drv_level; gpio_info->data = val.gpio.data; memcpy(gpio_info->gpio_name, sub_name, strlen(sub_name)+1); detect_print("%s.%s gpio=%d,mul_sel=%d,data:%d\n",main_name, sub_name, gpio_info->gpio, gpio_info->mul_sel, gpio_info->data); } else { ret = -1; detect_print("fetch script data %s.%s fail\n", main_name, sub_name); } } else if(cnt == MAX_VDD_STR_LEN) { type = script_get_item(main_name, sub_name, &val); if(SCIRPT_ITEM_VALUE_TYPE_STR == type) { strcpy((char *)buf, val.str); detect_print("%s.%s=%s\n", main_name, sub_name, (char *)buf); } else { ret = -1; detect_print("fetch script data %s.%s fail\n", main_name, sub_name); } } return ret; }
static __s32 camera_mclk_open(__camera_detector_t *camera_detector) { // __u32 i, csi_cnt = 0; detect_print("camera_mclk_open !!\n"); if (camera_sub_name_exist("csi0", "vip_used")) { camera_request_clk(0, &camera_detector->camera[0].module_clk, &camera_detector->camera[0].clk_src, &camera_detector->camera[0].clk_pin_hdle); } if (camera_sub_name_exist("csi1", "vip_used")) { camera_request_clk(1, &camera_detector->camera[1].module_clk, &camera_detector->camera[1].clk_src, &camera_detector->camera[1].clk_pin_hdle); } return 0; }
static void __exit camera_detector_exit(void) { detect_print("Bye, camera detect driver exit\n"); device_unregister(&camera_detector_device); }
static int __init camera_detector_init(void) { int err = 0; __u32 camera_list_size; char *camera_list_para = "camera_list_para"; char *camera_list_para_used = "camera_list_para_used"; detect_print("camera detect driver init\n"); if (!camera_sub_name_exist(camera_list_para, camera_list_para_used)) { __s32 value, ret; ret = camera_get_sysconfig(camera_list_para, camera_list_para_used, &value, 1); if (ret < 0) { detect_print("[camera_list_para] not exist in sys_config1.fex !! \n"); } else if (value == 0) { detect_print("[camera_list_para]->camera_list_para_used = 0," "maybe somebody does not want to use camera detector ...... \n"); } detect_print("camera detector exit, it will do nothing ...... \n"); goto exit; } camera_detector_device.groups = dev_attr_groups; err = device_register(&camera_detector_device); if (err) { camera_err("%s register camera detect driver as misc device error\n", __FUNCTION__); goto exit; } memset(camera_detector, 0, sizeof(__camera_detector_t)); err = camera_get_board_info(camera_detector); if (err) { camera_err("camera_get_board_info fail !!\n"); goto exit; } camera_list_size = sizeof(camera_list) / sizeof(__camera_list_t); camera_init_module_list(camera_list_size); camera_mclk_open(camera_detector); if ((camera_detector->camera[0].i2c_id == camera_detector->camera[1].i2c_id) && (camera_detector->num == 2)) { camera_same_i2c_id_detect(camera_detector, camera_list, camera_list_size); } else if ((camera_detector->camera[0].i2c_id != camera_detector->camera[1].i2c_id) || (camera_detector->num == 1)) { camera_diff_i2c_id_detect(camera_detector, camera_list, camera_list_size); } camera_mclk_close(camera_detector); return 0; exit: return err; }
/* use_b_para: TRUE: use para from [csi0_para] _b para FALSE: NOT use para from [csi0_para] _b para */ static __s32 camera_get_para(__camera_detector_t *camera_detector, __u32 camera_index, char *main_name, __bool use_b_para) { __u32 para_index; __u32 pin_struct_size; //char csi_drv_node[2][MAX_NODE_NAME_LEN] = {"/dev/video0", "/dev/video1"}; char csi_drv_node[2][MAX_NODE_NAME_LEN] = {"sun5i_csi0", "sun5i_csi1"}; __s32 ret; pin_struct_size = sizeof(__camera_gpio_set_t)/sizeof(__s32); if (strcmp(main_name, "csi0_para") == 0) { para_index = 0; } else { para_index = 1; } memcpy(camera_detector->camera[camera_index].drv_node_name, csi_drv_node[para_index], MAX_NODE_NAME_LEN); if (use_b_para) { camera_get_sysconfig(main_name, "csi_twi_id_b", &(camera_detector->camera[camera_index].i2c_id), 1); ret = camera_get_sysconfig(main_name, "csi_facing_b", (__s32 *)(&(camera_detector->camera[camera_index].facing)), 1); if (ret < 0) { detect_print("if you want to use camera detector, " "please add csi_facing_b in the [csi0_para]!! \n"); } camera_get_sysconfig(main_name, "csi_reset_b", (__s32 *)camera_detector->camera[camera_index].reset_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_power_en_b", (__s32 *)camera_detector->camera[camera_index].pwr_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_stby_b", (__s32 *)camera_detector->camera[camera_index].stby_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_af_en_b", (__s32 *)camera_detector->camera[camera_index].af_pwr_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_iovdd_b", (__s32 *)camera_detector->camera[camera_index].iovdd_str, MAX_VDD_STR_LEN); camera_get_sysconfig(main_name, "csi_avdd_b", (__s32 *)camera_detector->camera[camera_index].avdd_str, MAX_VDD_STR_LEN); camera_get_sysconfig(main_name, "csi_dvdd_b", (__s32 *)camera_detector->camera[camera_index].dvdd_str, MAX_VDD_STR_LEN); } else { camera_get_sysconfig(main_name, "csi_twi_id", &(camera_detector->camera[camera_index].i2c_id), 1); ret = camera_get_sysconfig(main_name, "csi_facing", (__s32 *)(&(camera_detector->camera[camera_index].facing)), 1); if (ret < 0) { detect_print("if you want to use camera detector, " "please add csi_facing in the [csi0_para]!! \n"); } camera_get_sysconfig(main_name, "csi_reset", (__s32 *)camera_detector->camera[camera_index].reset_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_power_en", (__s32 *)camera_detector->camera[camera_index].pwr_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_stby", (__s32 *)camera_detector->camera[camera_index].stby_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_af_en", (__s32 *)camera_detector->camera[camera_index].af_pwr_pin, pin_struct_size); camera_get_sysconfig(main_name, "csi_iovdd", (__s32 *)camera_detector->camera[camera_index].iovdd_str, MAX_VDD_STR_LEN); camera_get_sysconfig(main_name, "csi_avdd", (__s32 *)camera_detector->camera[camera_index].avdd_str, MAX_VDD_STR_LEN); camera_get_sysconfig(main_name, "csi_dvdd", (__s32 *)camera_detector->camera[camera_index].dvdd_str, MAX_VDD_STR_LEN); } if (camera_detector->camera[camera_index].reset_pin->port != 0) { camera_detector->camera[camera_index].reset_pin_used = 1; } if (camera_detector->camera[camera_index].pwr_pin->port != 0) { camera_detector->camera[camera_index].pwr_pin_used = 1; } if (camera_detector->camera[camera_index].stby_pin->port != 0) { camera_detector->camera[camera_index].stby_pin_used = 1; } if (strcmp(camera_detector->camera[camera_index].iovdd_str, "")) { camera_detector->camera[camera_index].iovdd = regulator_get(NULL, camera_detector->camera[camera_index].iovdd_str); if (IS_ERR(camera_detector->camera[camera_index].iovdd)) { camera_err("get regulator csi_iovdd error!! \n"); return -EPMUPIN; } } if (strcmp(camera_detector->camera[camera_index].avdd_str, "")) { camera_detector->camera[camera_index].avdd = regulator_get(NULL, camera_detector->camera[camera_index].avdd_str); if (IS_ERR(camera_detector->camera[camera_index].avdd)) { camera_err("get regulator csi_avdd error!! \n"); return -EPMUPIN; } } if (strcmp(camera_detector->camera[camera_index].dvdd_str, "")) { camera_detector->camera[camera_index].dvdd = regulator_get(NULL, camera_detector->camera[camera_index].dvdd_str); if (IS_ERR(camera_detector->camera[camera_index].dvdd)) { camera_err("get regulator csi_dvdd error!! \n"); return -EPMUPIN; } } return 0; }
static __s32 camera_same_i2c_id_detect(__camera_detector_t *camera_detector, __camera_list_t *camera_list, __u32 camera_list_size) { __u32 i, j; __u32 camera_detected = 0; __s32 ret = 0; detect_print("camera_same_i2c_id_detect!!\n"); detect_print("camera_detector->num = %d,camera_list_size = %d!!\n",camera_detector->num,camera_list_size); for (i = 0; i < camera_detector->num; i++) { for (j = 0; j < camera_list_size; j++) { if (camera_list[j].need_detect) { camera_stby_on_sensor(j,&camera_detector->camera[0]); camera_stby_on_sensor(j,&camera_detector->camera[1]); camera_list[j].pwr_on(j, &camera_detector->camera[i]); ret = camera_list[j].detect(j, camera_detector->camera[i].i2c_adap); if (ret == 0) { //camera_list[j].need_detect=false; camera_detected++; //camera_list[j].pwr_off(j, &camera_detector->camera[i]); strcpy(camera_detector->camera[i].name, camera_list[j].name); camera_detector->camera[i].i2c_addr = camera_list[j].i2c_addr; if(strcmp(camera_detector->camera[i].name,"gc2035") == 0 ) camera_detector->camera[i].i2c_addr=0x88; break; } } } } for (i = 0; i < camera_detector->num; i++) { unsigned int a,b,c; a=b=c=0; if(camera_detector->camera[i].iovdd) { while(regulator_is_enabled(camera_detector->camera[i].iovdd)) { a++; regulator_disable(camera_detector->camera[i].iovdd); //printk("cam[%d]iovdd count=%d\n",i,a); if(a>100) break; } regulator_put(camera_detector->camera[i].iovdd); } if(camera_detector->camera[i].avdd) { while(regulator_is_enabled(camera_detector->camera[i].avdd)) { b++; regulator_disable(camera_detector->camera[i].avdd); //printk("cam[%d]avdd count=%d\n",i,b); if(b>100) break; } regulator_put(camera_detector->camera[i].avdd); } if(camera_detector->camera[i].dvdd) { while(regulator_is_enabled(camera_detector->camera[i].dvdd)) { c++; regulator_disable(camera_detector->camera[i].dvdd); //printk("cam[%d]dvdd count=%d\n",i,c); if(c>100) break; } regulator_put(camera_detector->camera[i].dvdd); } } if (camera_detector->num != camera_detected) { camera_err("detect camera fail in func: camera_same_i2c_id_detect !!\n"); return -EDETECTFAIL; } detect_print("camera_detector->camera[0].name=%s,camera_detector->camera[1].name=%s\n",camera_detector->camera[0].name,camera_detector->camera[1].name); return 0; }
static __s32 camera_diff_i2c_id_detect(__camera_detector_t *camera_detector, __camera_list_t *camera_list, __u32 camera_list_size) { __u32 i, j; __u32 camera_detected = 0; __s32 ret = 0; detect_print("camera_diff_i2c_id_detect!!\n"); for (i = 0; i < camera_detector->num; i++) { for (j = 0; j < camera_list_size; j++) { if (camera_list[j].need_detect) { camera_list[j].pwr_on(j, &camera_detector->camera[i]); ret = camera_list[j].detect(j, camera_detector->camera[i].i2c_adap); camera_list[j].pwr_off(j, &camera_detector->camera[i]);//xiongbiao if (ret == 0) { //camera_list[j].pwr_off(j, &camera_detector->camera[i]); strcpy(camera_detector->camera[i].name, camera_list[j].name); camera_detector->camera[i].i2c_addr = camera_list[j].i2c_addr; camera_detected++; break; } } } } // for (i = 0; i < camera_detector->num; i++) { // unsigned int a,b,c; // a=b=c=0; // if(camera_detector->camera[i].iovdd) { // while(regulator_is_enabled(camera_detector->camera[i].iovdd)) // { // a++; // regulator_disable(camera_detector->camera[i].iovdd); // //printk("cam[%d]iovdd count=%d\n",i,a); // if(a>100) // break; // } // regulator_put(camera_detector->camera[i].iovdd); // } // if(camera_detector->camera[i].avdd) { // while(regulator_is_enabled(camera_detector->camera[i].avdd)) // { // b++; // regulator_disable(camera_detector->camera[i].avdd); // //printk("cam[%d]avdd count=%d\n",i,b); // if(b>100) // break; // } // regulator_put(camera_detector->camera[i].avdd); // } // if(camera_detector->camera[i].dvdd) { // while(regulator_is_enabled(camera_detector->camera[i].dvdd)) // { // c++; // regulator_disable(camera_detector->camera[i].dvdd); // //printk("cam[%d]dvdd count=%d\n",i,c); // if(c>100) // break; // } // regulator_put(camera_detector->camera[i].dvdd); // } // } if (camera_detector->num != camera_detected) { camera_err("detect camera fail in func: camera_diff_i2c_id_detect !!\n"); return -EDETECTFAIL; } return 0; }