Esempio n. 1
0
static int s5k6aafx_set_blur(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
    struct i2c_client *client = v4l2_get_subdevdata(sd);

    int err = -EINVAL;

    FUNC_ENTR();

#ifdef CONFIG_LOAD_FILE
    switch (ctrl->value)
    {
    case BLUR_LEVEL_0:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_vt_pretty_default");
        break;
    case BLUR_LEVEL_1:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_vt_pretty_1");
        break;
    case BLUR_LEVEL_2:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_vt_pretty_2");
        break;
    case BLUR_LEVEL_3:
    case BLUR_LEVEL_MAX:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_vt_pretty_3");
        break;
    default:
        dev_err(&client->dev, "%s : there's no blur value with [%d]\n", __func__,ctrl->value);
        return err;
        break;
    }
#else
    switch (ctrl->value)
    {
    case BLUR_LEVEL_0:
        err = s5k6aafx_write_regs(sd, s5k6aafx_vt_pretty_default, \
                                  sizeof(s5k6aafx_vt_pretty_default) / sizeof(s5k6aafx_vt_pretty_default[0]));
        break;
    case BLUR_LEVEL_1:
        err = s5k6aafx_write_regs(sd, s5k6aafx_vt_pretty_1, \
                                  sizeof(s5k6aafx_vt_pretty_1) / sizeof(s5k6aafx_vt_pretty_1[0]));
        break;
    case BLUR_LEVEL_2:
        err = s5k6aafx_write_regs(sd, s5k6aafx_vt_pretty_2, \
                                  sizeof(s5k6aafx_vt_pretty_2) / sizeof(s5k6aafx_vt_pretty_2[0]));
        break;
    case BLUR_LEVEL_3:
    case BLUR_LEVEL_MAX:
        err = s5k6aafx_write_regs(sd, s5k6aafx_vt_pretty_3, \
                                  sizeof(s5k6aafx_vt_pretty_3) / sizeof(s5k6aafx_vt_pretty_3[0]));
        break;
    default:
        dev_err(&client->dev, "%s : there's no blur value with [%d]\n", __func__,ctrl->value);
        return err;
        break;
    }
#endif

    if (err < 0)
    {
        dev_err(&client->dev, "%s : i2c_write for set blur\n", __func__);
        return -EIO;
    }

    return err;
}
Esempio n. 2
0
static int s5k6aafx_set_brightness(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
    struct i2c_client *client = v4l2_get_subdevdata(sd);
    int err = -EINVAL;

    FUNC_ENTR();
#ifdef CONFIG_LOAD_FILE
    switch (ctrl->value)
    {
    case EV_MINUS_4:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_m4");
        break;
    case EV_MINUS_3:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_m3");
        break;
    case EV_MINUS_2:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_m2");
        break;
    case EV_MINUS_1:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_m1");
        break;
    case EV_DEFAULT:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_default");
        break;
    case EV_PLUS_1:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_p1");
        break;
    case EV_PLUS_2:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_p2");
        break;
    case EV_PLUS_3:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_p3");
        break;
    case EV_PLUS_4:
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_bright_p4");
        break;
    default:
        dev_err(&client->dev, "%s : there's no brightness value with [%d]\n", __func__,ctrl->value);
        return err;
        break;
    }
#else
    switch (ctrl->value)
    {
    case EV_MINUS_4:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_m4, \
                                  sizeof(s5k6aafx_bright_m4) / sizeof(s5k6aafx_bright_m4[0]));
        break;
    case EV_MINUS_3:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_m3, \
                                  sizeof(s5k6aafx_bright_m3) / sizeof(s5k6aafx_bright_m3[0]));

        break;
    case EV_MINUS_2:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_m2, \
                                  sizeof(s5k6aafx_bright_m2) / sizeof(s5k6aafx_bright_m2[0]));
        break;
    case EV_MINUS_1:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_m1, \
                                  sizeof(s5k6aafx_bright_m1) / sizeof(s5k6aafx_bright_m1[0]));
        break;
    case EV_DEFAULT:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_default, \
                                  sizeof(s5k6aafx_bright_default) / sizeof(s5k6aafx_bright_default[0]));
        break;
    case EV_PLUS_1:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_p1, \
                                  sizeof(s5k6aafx_bright_p1) / sizeof(s5k6aafx_bright_p1[0]));
        break;
    case EV_PLUS_2:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_p2, \
                                  sizeof(s5k6aafx_bright_p2) / sizeof(s5k6aafx_bright_p2[0]));
        break;
    case EV_PLUS_3:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_p3, \
                                  sizeof(s5k6aafx_bright_p3) / sizeof(s5k6aafx_bright_p3[0]));
        break;
    case EV_PLUS_4:
        err = s5k6aafx_write_regs(sd, s5k6aafx_bright_p4, \
                                  sizeof(s5k6aafx_bright_p4) / sizeof(s5k6aafx_bright_p4[0]));
        break;
    default:
        dev_err(&client->dev, "%s : there's no brightness value with [%d]\n", __func__,ctrl->value);
        return err;
        break;
    }
#endif

    if (err < 0)
    {
        dev_err(&client->dev, "%s : i2c_write for set brightness\n", __func__);
        return -EIO;
    }

    return err;
}
Esempio n. 3
0
static inline int s5k6aafx_write(struct i2c_client *client,
                                 unsigned long packet)
{
    unsigned char buf[4];

    int err = 0;
    int retry_count = 5;

    struct i2c_msg msg =
    {
        .addr	= client->addr,
        .flags	= 0,
        .buf	= buf,
        .len	= 4,
    };

    if (!client->adapter)
    {
        dev_err(&client->dev, "%s: can't search i2c client adapter\n", __func__);
        return -EIO;
    }

    while(retry_count--)
    {
        *(unsigned long *)buf = cpu_to_be32(packet);
        err = i2c_transfer(client->adapter, &msg, 1);
        if (likely(err == 1))
            break;
        mdelay(10);
    }

    if (unlikely(err < 0))
    {
        dev_err(&client->dev, "%s: 0x%08x write failed\n", __func__, (unsigned int)packet);
        return err;
    }

    return (err != 1) ? -1 : 0;
}

#ifdef CONFIG_LOAD_FILE

static int s5k6aafx_write_regs_from_sd(struct v4l2_subdev *sd, char s_name[])
{

    struct i2c_client *client = v4l2_get_subdevdata(sd);
    struct test *tempData;

    int ret = -EAGAIN;
    unsigned long temp;
    char delay = 0;
    char data[11];
    int searched = 0;
    int size = strlen(s_name);
    int i;

    FUNC_ENTR();

    printk("size = %d, string = %s\n", size, s_name);
    tempData = &testBuf[0];
    while(!searched)
    {
        searched = 1;
        for (i = 0; i < size; i++)
        {
            if (tempData->data != s_name[i])
            {
                searched = 0;
                break;
            }
            tempData = tempData->nextBuf;
        }
        tempData = tempData->nextBuf;
    }
    //structure is get..

    while(1)
    {
        if (tempData->data == '{')
        {
            break;
        }
        else
        {
            tempData = tempData->nextBuf;
        }
    }

    while (1)
    {
        searched = 0;
        while (1)
        {
            if (tempData->data == 'x')
            {
                //get 10 strings
                data[0] = '0';
                for (i = 1; i < 11; i++)
                {
                    data[i] = tempData->data;
                    tempData = tempData->nextBuf;
                }
                //printk("%s\n", data);
                temp = simple_strtoul(data, NULL, 16);
                break;
            }
            else if (tempData->data == '}')
            {
                searched = 1;
                break;
            }
            else
            {
                tempData = tempData->nextBuf;
            }

            if (tempData->nextBuf == NULL)
            {
                return -1;
            }
        }

        if (searched)
        {
            break;
        }

        //let search...
        if ((temp & S5K6AAFX_DELAY) == S5K6AAFX_DELAY)
        {
            delay = temp & 0xFFFF;
            //printk("func(%s):line(%d):delay(0x%x):delay(%d)\n",__func__,__LINE__,delay,delay);
            msleep(delay);
            continue;
        }

        ret = s5k6aafx_write(client, temp);

        /* In error circumstances */
        /* Give second shot */
        if (unlikely(ret))
        {
            dev_info(&client->dev,
                     "s5k6aafx i2c retry one more time\n");
            ret = s5k6aafx_write(client, temp);

            /* Give it one more shot */
            if (unlikely(ret))
            {
                dev_info(&client->dev,
                         "s5k6aafx i2c retry twice\n");
                ret = s5k6aafx_write(client, temp);
            }
        }
    }

    return ret;
}
#endif

/* program multiple registers */
static int s5k6aafx_write_regs(struct v4l2_subdev *sd,
                               unsigned long *packet, unsigned int num)
{
    struct i2c_client *client = v4l2_get_subdevdata(sd);
    int ret = -EAGAIN;	/* FIXME */
    unsigned long temp;
    char delay = 0;

    while (num--)
    {
        temp = *packet++;

        /*
        		if ((temp & S5K6AAFX_DELAY) == S5K6AAFX_DELAY)
        		{
        			if (temp & 0x1)
        			{
        				dev_info(&client->dev, "delay for 100msec\n");
        				msleep(100);
        				continue;
        			}
        			else
        			{
        				dev_info(&client->dev, "delay for 10msec\n");
        				msleep(10);
        				continue;
        			}
        		}
        */

#if 1
        if ((temp & S5K6AAFX_DELAY) == S5K6AAFX_DELAY)
        {
            delay = temp & 0xFFFF;
            //printk("func(%s):line(%d):delay(0x%x):delay(%d)\n",__func__,__LINE__,delay,delay);
            msleep(delay);
            continue;
        }
#endif
        ret = s5k6aafx_write(client, temp);

        /* In error circumstances */
        /* Give second shot */
        if (unlikely(ret))
        {
            dev_info(&client->dev,
                     "s5k6aafx i2c retry one more time\n");
            ret = s5k6aafx_write(client, temp);

            /* Give it one more shot */
            if (unlikely(ret))
            {
                dev_info(&client->dev,
                         "s5k6aafx i2c retry twice\n");
                ret = s5k6aafx_write(client, temp);
                break;
            }
        }
    }

    dev_info(&client->dev, "S5K6AAFX register programming ends up\n");
    if( ret < 0)
        return -EIO;

    return ret;	/* FIXME */
}

static int s5k6aafx_set_capture_start(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
{
    struct i2c_client *client = v4l2_get_subdevdata(sd);
    struct s5k6aafx_state *state = to_state(sd);

    int err = -EINVAL;
    unsigned short lvalue = 0;

    FUNC_ENTR();

    s5k6aafx_write(client, 0x002C7000);
    s5k6aafx_write(client, 0x002E1AAA); //read light value

    s5k6aafx_read(client, 0x0F12, &lvalue);

    printk("%s : light value is %x\n", __func__, lvalue);

    /* set initial regster value */
#ifdef CONFIG_LOAD_FILE
    err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_capture");
#else
    err = s5k6aafx_write_regs(sd, s5k6aafx_capture,
                              sizeof(s5k6aafx_capture) / sizeof(s5k6aafx_capture[0]));
#endif
    if (lvalue < 0x40)
    {
        printk("\n----- low light -----\n\n");
        mdelay(100);//add 100 ms delay for capture sequence
    }
    else
    {
        printk("\n----- normal light -----\n\n");
        mdelay(50);
    }

    if (unlikely(err))
    {
        printk("%s: failed to make capture\n", __func__);
        return err;
    }

    state->runmode = S5K6AAFX_RUNMODE_IDLE;

    return err;
}

static int s5k6aafx_set_preview_start(struct v4l2_subdev *sd)
{
    struct i2c_client *client = v4l2_get_subdevdata(sd);
    struct s5k6aafx_state *state = to_state(sd);

    int err = -EINVAL;

    FUNC_ENTR();

    dev_info(&client->dev, "%s: set_Preview_start\n", __func__);


    if(state->check_dataline)		// Output Test Pattern from VGA sensor
    {
        printk(" pattern on setting~~~~~~~~~~~\n");
        err = s5k6aafx_write_regs(sd, s5k6aafx_pattern_on, sizeof(s5k6aafx_pattern_on) / sizeof(s5k6aafx_pattern_on[0]));
        //  mdelay(200);
    }
    else
    {

        /* set initial regster value */
#ifdef CONFIG_LOAD_FILE
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_preview");
#else
        err = s5k6aafx_write_regs(sd, s5k6aafx_preview,
                                  sizeof(s5k6aafx_preview) / sizeof(s5k6aafx_preview[0]));
#endif
        if (unlikely(err)) {
            printk("%s: failed to make preview\n", __func__);
            return err;
        }
    }
    if(state->set_vhflip == 1)
    {
        err = s5k6aafx_write_regs(sd, s5k6aafx_vhflip_on,
                                  sizeof(s5k6aafx_vhflip_on) / sizeof(s5k6aafx_vhflip_on[0]));
    }

    state->runmode = S5K6AAFX_RUNMODE_RUNNING;
//	mdelay(200); // add 200 ms for displaying preview

    return err;
}

static int s5k6aafx_set_preview_stop(struct v4l2_subdev *sd)
{
    struct s5k6aafx_state *state = to_state(sd);

    int err = 0;

    state->runmode = S5K6AAFX_RUNMODE_IDLE;

    return err;
}

#if 0
static int s5k6aafx_s_crystal_freq(struct v4l2_subdev *sd, u32 freq, u32 flags)
{
    int err = -EINVAL;

    FUNC_ENTR();
    return err;
}
Esempio n. 4
0
static int s5k6aafx_init(struct v4l2_subdev *sd, u32 val)
{
    //struct i2c_client *client = v4l2_get_subdevdata(sd);
    struct s5k6aafx_state *state = to_state(sd);

    int err = -EINVAL;

    FUNC_ENTR();

#ifdef CONFIG_LOAD_FILE
    err = loadFile();
    if (unlikely(err)) {
        printk("%s: failed to init\n", __func__);
        return err;
    }
#endif

    /* set initial regster value */
    if (state->vt_mode == 0)
    {
        printk("%s: load camera common setting \n", __func__);
#ifdef CONFIG_LOAD_FILE
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_common");
#else
        err = s5k6aafx_write_regs(sd, s5k6aafx_common,	sizeof(s5k6aafx_common) / sizeof(s5k6aafx_common[0]));
#endif
    }
    else
    {
        printk("%s: load camera VT call setting \n", __func__);
#ifdef CONFIG_LOAD_FILE
        err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_vt_common");
#else
        err = s5k6aafx_write_regs(sd, s5k6aafx_vt_common, sizeof(s5k6aafx_vt_common) / sizeof(s5k6aafx_vt_common[0]));
#endif

    }

    if (unlikely(err))
    {
        printk("%s: failed to init\n", __func__);
        return err;
    }

#if defined(CONFIG_TARGET_LOCALE_LTN)
    //latin_cam VT Cam Antibanding
    if (state->anti_banding == ANTI_BANDING_60HZ)
    {
        err = s5k6aafx_set_60hz_antibanding(sd);
        if (unlikely(err))
        {
            printk("%s: failed to s5k6aafx_set_60hz_antibanding \n", __func__);
            return err;
        }
    }
    //hmin84.park -10.07.06
#endif

    state->set_fmt.width = DEFAULT_WIDTH;
    state->set_fmt.height = DEFAULT_HEIGHT;

    return 0;
}
Esempio n. 5
0
static int s5k6aafx_init(struct v4l2_subdev *sd, u32 val)
{
	//struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct s5k6aafx_state *state = to_state(sd);
	int err = -EINVAL;
	static int lock_level = -1;

	FUNC_ENTR();

#ifdef CONFIG_LOAD_FILE
	err = loadFile();
	if (unlikely(err)) {
		printk("%s: failed to init\n", __func__);
		return err;
	}
#endif

#if defined(CONFIG_CPU_FREQ)
	if (lock_level < 0)
		lock_level = s5pv310_cpufreq_round_idx(CPUFREQ_1200MHZ);
	if (s5pv310_cpufreq_lock(DVFS_LOCK_ID_CAM, lock_level))
		printk(KERN_ERR "%s: error : failed lock DVFS\n", __func__);
#endif

	/* set initial regster value */
	if (state->vt_mode == 0)
	{
		printk("%s: load camera common setting \n", __func__);
#ifdef CONFIG_LOAD_FILE
		err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_common");
#else
		err = s5k6aafx_write_regs(sd, s5k6aafx_common,	sizeof(s5k6aafx_common) / sizeof(s5k6aafx_common[0]));
#endif
	}
	else
	{
		printk("%s: load camera VT call setting \n", __func__);
#ifdef CONFIG_LOAD_FILE
		err = s5k6aafx_write_regs_from_sd(sd, "s5k6aafx_vt_common");
#else
		err = s5k6aafx_write_regs(sd, s5k6aafx_vt_common, sizeof(s5k6aafx_vt_common) / sizeof(s5k6aafx_vt_common[0]));
#endif

	}

#if defined(CONFIG_CPU_FREQ)
	s5pv310_cpufreq_lock_free(DVFS_LOCK_ID_CAM);
#endif

	if (unlikely(err))
	{
		printk("%s: failed to init\n", __func__);
		return err;
	}

#if defined(CONFIG_TARGET_LOCALE_LTN)
	//latin_cam VT Cam Antibanding
	if (state->anti_banding == ANTI_BANDING_60HZ)
	{
		err = s5k6aafx_set_60hz_antibanding(sd);
		if (unlikely(err))
		{
			printk("%s: failed to s5k6aafx_set_60hz_antibanding \n", __func__);
			return err;
		}
	}
	//hmin84.park -10.07.06
#endif

	state->set_fmt.width = DEFAULT_WIDTH;
	state->set_fmt.height = DEFAULT_HEIGHT;

	return 0;
}