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;
}
Пример #6
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", "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;
}
Пример #10
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;
}
Пример #11
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;
}