diff --git a/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.c b/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.c index eba802510eb017138f9f12c9cb1598072d0b06b8..a613417cbd8bcbda0664bf5f064015a83965f36f 100644 --- a/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.c +++ b/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.c @@ -38,16 +38,15 @@ static int32_t gyro_offset_Y = 0; static int32_t gyro_offset_X_check = -1; static int32_t gyro_offset_Y_check = -1; static int32_t ois_reg_value = -1; - +static int32_t ois_gain_get_value = -1; static int calibration_status = 0; static int ois_status = 0; static int ois_init_status = 0; - -extern float gyro_gain_X; -extern float gyro_gain_Y; +extern int gyro_gain_test[2]; static int32_t decrease_gain_X = 0; static int32_t decrease_gain_Y = 0; +static int32_t gyro_gain_init[2] = {0}; int32_t cam_ois_construct_default_power_setting( struct cam_sensor_power_ctrl_t *power_info) @@ -334,8 +333,10 @@ static int cam_ois_gyro_calibration(struct cam_ois_ctrl_t *o_ctrl) uint32_t fw_size; uint32_t cmd_adress=0,cmd_data=0; uint32_t c=0,d=0; - float target_gain_X = 0.0; - float target_gain_Y = 0.0; + + int bit31=0,bit22=0,bit21=0,bit20=0,bit19=0,bit18=0,bit17=0,bit16=0, + bit15=0,bit14=0,bit13=0,bit12=0; + int x=0,e=0,i=0; const REGSETTING cml_ois_gyro_calibration[]= { //gyro cali mode @@ -406,12 +407,46 @@ static int cam_ois_gyro_calibration(struct cam_ois_ctrl_t *o_ctrl) CAM_ERR(CAM_OIS, "write 0x0024 -> 0x0001"); mdelay(50); + if (gyro_gain_test[0] != 0 && gyro_gain_test[1] != 0) + { + gyro_gain_init[0] = gyro_gain_test[0]; + gyro_gain_init[1] = gyro_gain_test[1]; + } + + for(i=0;i<2;i++) + { + bit31 = (gyro_gain_init[i] & 0x80000000) >> 31; + bit22 = (gyro_gain_init[i] & 0x00400000) >> 22; + bit21 = (gyro_gain_init[i] & 0x00200000) >> 21; + bit20 = (gyro_gain_init[i] & 0x00100000) >> 20; + bit19 = (gyro_gain_init[i] & 0x00080000) >> 19; + bit18 = (gyro_gain_init[i] & 0x00040000) >> 18; + bit17 = (gyro_gain_init[i] & 0x00020000) >> 17; + bit16 = (gyro_gain_init[i] & 0x00010000) >> 16; + bit15 = (gyro_gain_init[i] & 0x00008000) >> 15; + bit14 = (gyro_gain_init[i] & 0x00004000) >> 14; + bit13 = (gyro_gain_init[i] & 0x00002000) >> 13; + bit12 = (gyro_gain_init[i] & 0x00001000) >> 12; + + x = (int)(bit22*4096+bit21*2048+bit20*1024+bit19*512+bit18*256+bit17*128+bit16*64+bit15*32+bit14*16+bit13*8+bit12*4); + e = (gyro_gain_init[i] & 0x7f800000) >> 23; + if (e < 127) + gyro_gain_init[i] = (8192+x)/(1 << (127-e)); + else + gyro_gain_init[i] = (8192+x)*(1 << (e-127)); + + if (bit31 == 1) + gyro_gain_init[i] = (-1)*gyro_gain_init[i]; + + CAM_ERR(CAM_OIS, "x 0x%x,e 0x%x",x,e); + CAM_ERR(CAM_OIS, "gyro_gain_init[%d] 0x%x",i,gyro_gain_init[i]); + + } + if (decrease_gain_X == 0 && decrease_gain_Y == 0) { - target_gain_X = gyro_gain_X - default_gain_X; - target_gain_Y = gyro_gain_Y - default_gain_Y; - c = (int) (target_gain_X*8192); - d = (int) (target_gain_Y*8192); + c= (int)((gyro_gain_init[0]*1000 - default_gain_X*8192)/1000); + d= (int)((gyro_gain_init[1]*1000 - default_gain_Y*8192)/1000); if (c<=11264 && c>=5939 && d<=11060 && d>=6144)//0.725-1.375,0.75-1.35 { @@ -435,10 +470,9 @@ static int cam_ois_gyro_calibration(struct cam_ois_ctrl_t *o_ctrl) } else { - target_gain_X = gyro_gain_X - (float) decrease_gain_X/1000; - target_gain_Y = gyro_gain_Y - (float) decrease_gain_Y/1000; - c = (int) (target_gain_X*8192); - d = (int) (target_gain_Y*8192); + c= (int)((gyro_gain_init[0]*1000 - decrease_gain_X*8192)/1000); + d= (int)((gyro_gain_init[1]*1000 - decrease_gain_Y*8192)/1000); + CAM_ERR(CAM_OIS, "c 0x%x,d 0x%x",c,d); if (c<=11264 && c>=5939 && d<=11060 && d>=6144)//0.725-1.375,0.75-1.35 { @@ -1426,6 +1460,52 @@ static int cam_cml_ois_fw_upgrade(struct cam_ois_ctrl_t *o_ctrl) return rc; } +ssize_t ois_gain_get_show(struct device *dev, struct device_attribute *attr, char *buf){ + + return sprintf(buf, "0x%x\n", ois_gain_get_value); + +} + +ssize_t ois_gain_get_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){ + + struct cam_ois_ctrl_t *o_ctrl = NULL; + char cmd_buf[32]; + uint32_t cmd_adress=0,cmd_data=0,read_data=0; + char flag; + int rc = 0; + + struct platform_device *pdev = container_of(dev, struct platform_device, dev); + memset(cmd_buf,0,32); + o_ctrl = platform_get_drvdata(pdev); + + if (!o_ctrl) { + CAM_ERR(CAM_OIS, "Invalid Args"); + return count; + } + + //cpy user cmd to kernel 0x:0x:r/w + strcpy(cmd_buf,buf); + sscanf(cmd_buf,"%x:%x:%c",&cmd_adress,&cmd_data,&flag); + + if (flag == 'r' && cmd_data == 0x0) + { + mdelay(50); + rc = camera_io_dev_read(&(o_ctrl->io_master_info),cmd_adress,&read_data,CAMERA_SENSOR_I2C_TYPE_WORD,CAMERA_SENSOR_I2C_TYPE_WORD); + if (rc < 0) + { + CAM_ERR(CAM_OIS, "read %x failed: %d",cmd_adress,rc); + } + else + { + CAM_DBG(CAM_OIS,"read %x -> 0x%x",cmd_adress,read_data); + ois_gain_get_value = read_data; + } + mdelay(50); + } + + return count; +} + ssize_t ois_reg_show(struct device *dev, struct device_attribute *attr, char *buf){ @@ -1569,6 +1649,9 @@ ssize_t ois_reg_store(struct device *dev, struct device_attribute *attr, const } } + cma_release(dev_get_cma_area((o_ctrl->soc_info.dev)), page, fw_size); + page = NULL; + return count; } diff --git a/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.h b/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.h index bd5f5fe46b2f8ac81cd7c9e6c97be268cb155f63..45116e0e857f84b4338333d13a9c02cc50de3673 100644 --- a/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.h +++ b/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_core.h @@ -38,6 +38,8 @@ ssize_t ois_status_show(struct device *dev, struct device_attribute *attr, char ssize_t ois_status_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); ssize_t ois_reg_show(struct device *dev, struct device_attribute *attr, char *buf); ssize_t ois_reg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +ssize_t ois_gain_get_show(struct device *dev, struct device_attribute *attr, char *buf); +ssize_t ois_gain_get_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); ssize_t ois_init_before_sr_test_show(struct device *dev, struct device_attribute *attr, char *buf); ssize_t ois_init_before_sr_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); ssize_t ois_gain_set_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); diff --git a/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c b/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c index 8402d0cfabed197fab851469e29a93add9b48eac..49a07334b5a9dc3b827ceea2ef2288cbf8e7f8b9 100644 --- a/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c +++ b/techpack/camera/drivers/cam_sensor_module/cam_ois/cam_ois_dev.c @@ -185,6 +185,7 @@ static int cam_ois_init_subdev_param(struct cam_ois_ctrl_t *o_ctrl) DEVICE_ATTR(ois_gyro_cali_data, 0664, ois_gyro_cali_data_show, ois_gyro_cali_data_store); DEVICE_ATTR(ois_status, 0664, ois_status_show, ois_status_store); DEVICE_ATTR(ois_reg, 0664, ois_reg_show, ois_reg_store); +DEVICE_ATTR(ois_gain_get, 0664, ois_gain_get_show, ois_gain_get_store); DEVICE_ATTR(ois_init_before_sr_test, 0664, ois_init_before_sr_test_show, ois_init_before_sr_test_store); DEVICE_ATTR(ois_gain_set, 0664, ois_gain_set_show, ois_gain_set_store); @@ -525,6 +526,7 @@ static int32_t cam_ois_platform_driver_probe( if ((device_create_file(&pdev->dev, &dev_attr_ois_gyro_cali_data)) || (device_create_file(&pdev->dev, &dev_attr_ois_status)) || (device_create_file(&pdev->dev, &dev_attr_ois_reg)) || + (device_create_file(&pdev->dev, &dev_attr_ois_gain_get)) || (device_create_file(&pdev->dev, &dev_attr_ois_gain_set)) || (device_create_file(&pdev->dev, &dev_attr_ois_init_before_sr_test))) { @@ -576,6 +578,7 @@ static int cam_ois_platform_driver_remove(struct platform_device *pdev) device_remove_file(&pdev->dev, &dev_attr_ois_gyro_cali_data); device_remove_file(&pdev->dev, &dev_attr_ois_status); device_remove_file(&pdev->dev, &dev_attr_ois_reg); + device_remove_file(&pdev->dev, &dev_attr_ois_gain_get); device_remove_file(&pdev->dev, &dev_attr_ois_gain_set); device_remove_file(&pdev->dev, &dev_attr_ois_init_before_sr_test); CAM_ERR(CAM_OIS, " device_remove_file node"); diff --git a/techpack/camera/drivers/cam_sensor_module/cam_sensor_io/cam_sensor_cci_i2c.c b/techpack/camera/drivers/cam_sensor_module/cam_sensor_io/cam_sensor_cci_i2c.c index 4066c8c4dfaaa377de2e4e00de774f19a42a838d..4fa17e195048d9480363e813b9b67d3112f5733e 100644 --- a/techpack/camera/drivers/cam_sensor_module/cam_sensor_io/cam_sensor_cci_i2c.c +++ b/techpack/camera/drivers/cam_sensor_module/cam_sensor_io/cam_sensor_cci_i2c.c @@ -53,12 +53,12 @@ int32_t cam_cci_i2c_read(struct cam_sensor_cci_client *cci_client, union sf { - float f; + int f; unsigned char s[4]; }cam_gyro_gain; -float gyro_gain_X = 0.0; -float gyro_gain_Y = 0.0; +int gyro_gain_test[2] = {0}; + int32_t cam_camera_cci_i2c_read_seq(struct cam_sensor_cci_client *cci_client, uint32_t addr, uint8_t *data, @@ -106,13 +106,13 @@ int32_t cam_camera_cci_i2c_read_seq(struct cam_sensor_cci_client *cci_client, d[i] = data[6980+i]; snprintf(cam_gyro_gain.s, sizeof(cam_gyro_gain.s), "%c%c%c%c", d[0],d[1],d[2],d[3]); - gyro_gain_X = cam_gyro_gain.f;//X gain + gyro_gain_test[0] = cam_gyro_gain.f; for (i = 0; i < 4; i++) d[i] = data[6984+i]; snprintf(cam_gyro_gain.s, sizeof(cam_gyro_gain.s), "%c%c%c%c", d[0],d[1],d[2],d[3]); - gyro_gain_Y = cam_gyro_gain.f;//Y gain + gyro_gain_test[1] = cam_gyro_gain.f; }