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;
}
static __s32 camera_get_board_info(__camera_detector_t *camera_detector)
{
        char *csi[2] = {"csi0_para", "csi1_para"};
        __s32 value;
        __s32 ret;

        //get camera number
        if (camera_sub_name_exist(csi[0], "csi_used") 
                && camera_sub_name_exist(csi[1], "csi_used")) {
                camera_detector->num = 2;
        }
        else if (camera_sub_name_exist(csi[0], "csi_used")) {
                ret = camera_get_sysconfig(csi[0], "csi_dev_qty", &value, 1);
                if (ret < 0) {
                        return -ECFGNOEX;
                }
                else {
                        camera_detector->num = value;
                        if ((camera_detector->num > 2) || (camera_detector->num <= 0)) {
                                return -ECAMNUMERR;
                        }
                }
        }
        else {
                return -ECFGERR;
        }
    
        camera_get_para(camera_detector, 0, csi[0], FALSE);
        if (camera_detector->num == 2) {
                if (camera_sub_name_exist(csi[1], "csi_used")) {
                        camera_get_para(camera_detector, 1, csi[1], FALSE);
                }
                else {
                        camera_get_para(camera_detector, 1, csi[0], TRUE);
                }
        }
    
        //get I2C adapter
        camera_detector->camera[0].i2c_adap = i2c_get_adapter(camera_detector->camera[0].i2c_id);
        if (camera_detector->camera[0].i2c_adap == NULL) {
                camera_err("get I2C adapter fail, I2C id: %d \n", camera_detector->camera[0].i2c_id);

                return -EI2CADAPTER;
        }
        if (camera_detector->num == 2) {
                if (camera_detector->camera[0].i2c_id != camera_detector->camera[1].i2c_id) {
                        camera_detector->camera[1].i2c_adap = i2c_get_adapter(camera_detector->camera[1].i2c_id);
                        if (camera_detector->camera[1].i2c_adap == NULL) {
                                camera_err("get I2C adapter fail, I2C id: %d \n", camera_detector->camera[1].i2c_id);

                                return -EI2CADAPTER;
                        } 
                }
                else {
                        camera_detector->camera[1].i2c_adap = camera_detector->camera[0].i2c_adap;
                }
        }
    
    return 0;
}
Ejemplo n.º 3
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 __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 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;
}