コード例 #1
0
static int ltr558_devinit(void)
{
        int error;
        int init_ps_gain;
        int init_als_gain;

        mdelay(PON_DELAY);

        // Enable PS to Gain1 at startup
        init_ps_gain = PS_RANGE1;
        //ps_gainrange = init_ps_gain;

        error = ltr558_ps_enable(init_ps_gain);
        if (error < 0)
        {
                printk("[ltr558] device init error!!!\n");
                goto out;
        }

        // Enable ALS to Full Range at startup
        init_als_gain = ALS_RANGE2_64K;
        //als_gainrange = init_als_gain;

        error = ltr558_als_enable(init_als_gain);
        if (error < 0)
        {
                printk("[ltr558] device init error!!!\n");
                goto out;
        }
        error = 0;
        printk("[ltr558] device init success!!!\n");

        out:
        return error;
}
コード例 #2
0
ファイル: ltr558als.c プロジェクト: FrozenCow/FIRE-ICE
static ssize_t store_als_enable(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
	struct ltr558_chip *chip = iio_priv(indio_dev);
	struct i2c_client *client = chip->client;
	int err = 0;
	unsigned long lval;

	dev_vdbg(dev, "%s()\n", __func__);

	if (strict_strtoul(buf, 10, &lval))
		return -EINVAL;
	if ((lval != 1) && (lval != 0)) {
		dev_err(dev, "illegal value %lu\n", lval);
		return -EINVAL;
	}

	mutex_lock(&chip->lock);
	if (lval == 1)
		err = ltr558_als_enable(client, chip->als_gainrange);
	else
		err = ltr558_als_disable(client);

	if (err < 0)
		dev_err(dev, "Error in enabling ALS\n");
	else
		chip->is_als_enable = (lval) ? true : false;

	mutex_unlock(&chip->lock);
	return count;
}
コード例 #3
0
ファイル: ltr558.c プロジェクト: nightvixen/explosion_kernel
/*******************************************
function:enable or disable the L-sensor
parameter: 
	@l_flag:the flag that we want to disblae or enable L-sensor
		LS_ENABLE: enable L-sensor
		LS_DISABLE: disable L-sensor
return:
	return none zero means fail 
********************************************/
static int ltr558_updata_als_status(short l_flag){
	int result = 0;
		
	if((ALS_ENABLE == l_flag) && (ALS_DISABLE == ltr558_data->l_enable)){
		P_L_printk("enable L-sensor\n");
		result = ltr558_als_enable(ALS_GAINRANGE);
		if (0 == result){
			ltr558_data->l_enable = ALS_ENABLE;
		}
	}else if((ALS_DISABLE == l_flag) && (ALS_ENABLE == ltr558_data->l_enable)){
		P_L_printk("disable L-sensor\n");
		result =  ltr558_als_disable();
		if(0 == result){
			ltr558_data->l_enable = ALS_DISABLE;
		}
	}else{
		LTRDBG("L-sensor already %s\n", (l_flag) ? "enable" : "disable");
		result = 0;
	}

	return result;
}
コード例 #4
0
ファイル: ltr558als.c プロジェクト: FrozenCow/FIRE-ICE
static int ltr558_chip_init(struct i2c_client *client)
{
	struct iio_dev *indio_dev = i2c_get_clientdata(client);
	struct ltr558_chip *chip = iio_priv(indio_dev);
	int error = 0;

	msleep(PON_DELAY);

	chip->is_prox_enable  = 0;
	chip->prox_low_thres = 0;
	chip->prox_high_thres = 0x7FF;
	chip->prox_reading = 0;

	chip->als_low_thres = 0;
	chip->als_high_thres = 0xFFFF;
	chip->als_reading = 0;

	chip->is_als_enable = 0;
	chip->prox_persist = 0;
	chip->als_persist = 0;

	/* Enable PS to Gain1 at startup */
	chip->ps_gainrange = PS_RANGE1;
	error = ltr558_ps_enable(client, chip->ps_gainrange);
	if (error < 0)
		goto out;


	/* Enable ALS to Full Range at startup */
	chip->als_gainrange = ALS_RANGE2_64K;
	error = ltr558_als_enable(client, chip->als_gainrange);
	if (error < 0)
		goto out;

out:
	return error;
}
コード例 #5
0
ファイル: ltr558.c プロジェクト: nightvixen/explosion_kernel
static int ltr558_probe(struct i2c_client *client, const struct i2c_device_id *id){
	int ret = 0;
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);

	/* Return 1 if adapter supports everything we need, 0 if not. */
	if (!i2c_check_functionality(adapter, 
		I2C_FUNC_SMBUS_WRITE_BYTE |I2C_FUNC_SMBUS_READ_BYTE_DATA)){
		LTRERR(KERN_ALERT "%s: LTR-558ALS functionality check failed.\n", __func__);
		ret = -EIO;
		goto exit_check_functionality_failed;
	}

	/* data memory allocation */
	ltr558_data = kzalloc(sizeof(struct ltr558_data), GFP_KERNEL);
	if (ltr558_data == NULL) {
		LTRERR(KERN_ALERT "%s: LTR-558ALS kzalloc failed.\n", __func__);
		ret = -ENOMEM;
		goto exit_alloc_data_failed;
	}
	ltr558_data->ltr558_irq = client->irq;
	//printk("%s: Irq number is == %d\n",client->irq);
	
	ltr558_data->p_enable = 0;
	ltr558_data->l_enable = 0;
	ltr558_data->ltr558_input = NULL;
	ltr558_data->client = client;
	INIT_WORK(&(ltr558_data->irq_workqueue),ltr558_schedwork);
	i2c_set_clientdata(client, ltr558_data);
	
	/*init device by send i2c command*/
	ret = ltr558_devinit();
	if (ret) {
		LTRERR(KERN_ALERT "%s: LTR-558ALS device init failed.\n", __func__);
		goto exit_device_init_failed;
	}

	/*init  & register input dev*/
	ltr558_data->ltr558_input = input_allocate_device();
	if (ltr558_data->ltr558_input == NULL) {
		LTRERR(KERN_ALERT "%s: LTR-558ALS cllocate input device fail.\n", __func__);
		ret = -ENOMEM;
		goto exit_input_dev_alloc_failed;
	}
	
	ltr558_data->ltr558_input->name = "lightsensor";
	set_bit(EV_ABS, ltr558_data->ltr558_input->evbit);
	input_set_abs_params(ltr558_data->ltr558_input, ABS_MISC, 0, 100000, 0, 0);
	input_set_abs_params(ltr558_data->ltr558_input, ABS_DISTANCE, 0, 128, 0, 0);	

	ret = input_register_device(ltr558_data->ltr558_input);
	if (ret) {
		LTRERR(KERN_ALERT "%s: LTR-558ALS failed to register input device.\n", __func__);
		goto exit_input_register_device_failed;
	}	

	/*register misc device*/
	ret = misc_register(&ltr558_device);
	if (ret) {
		LTRERR(KERN_ALERT "%s: LTR-558ALS misc_register als failed.\n", __func__);
		goto exit_misc_device_register_failed;
	}

	/*init irq*/
	ret = ltr558_gpio_irq();
	if (ret) {
		LTRERR(KERN_ALERT "%s: LTR-558ALS gpio_irq failed.\n", __func__);
		goto exit_irq_request_failed;
	}

#if 0
//add charles.hu  just for test
	mdelay(600);
	ltr558_als_enable(ALS_RANGE2_64K);
	ltr558_ps_enable(PS_GAINRANGE);
	mdelay(600);
	P_L_printk("Ltr558 probe ok!!!\n");
//add end	
#endif	

	return 0;

exit_irq_request_failed:
	misc_deregister(&ltr558_device);
exit_misc_device_register_failed:
exit_input_register_device_failed:
	input_free_device(ltr558_data->ltr558_input);
exit_input_dev_alloc_failed:
exit_device_init_failed:
	kfree(ltr558_data);
exit_alloc_data_failed:
exit_check_functionality_failed:
	return ret;
}
コード例 #6
0
static int
ltr558_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
     unsigned long arg)
{
    int ret = 0;
    int flag;
    int set_flag;
    void __user *argp = (void __user *)arg;
    switch (cmd)
    {
        case ECS_IOCTL_APP_SET_LFLAG:
        {
            LTR558_DBG("into set lflag!!!\n");
            if (copy_from_user(&flag, argp, sizeof(flag)))
            {
                return -EFAULT;
            }
            atomic_set(&l_flag, flag);
            set_flag = atomic_read(&l_flag) ? 1 : 0;
			/*set bit 1 of reg 0 by set_flag */
			if (set_flag)
			{
				ret = ltr558_als_enable(ltr_this_data,als_gainrange);
                if (ret < 0)
                {
                    printk(KERN_ERR "%s:enable TLR558 als failed ,ret = %d\n", __func__,ret);
                }   
			}
			else
			{
                LTR558_DBG("%s:disable light sensor\n", __func__);
				ret = ltr558_als_disable(ltr_this_data);
                if (ret < 0)
                {
                    printk(KERN_ERR "%s:LTR set diable LFLAG is error(%d)!", __func__, ret);
                }
			}
            break;
        }
        case ECS_IOCTL_APP_GET_LFLAG:
        {
            flag = atomic_read(&l_flag);
            printk(KERN_ERR "%s:get light flag\n", __func__);
            if (copy_to_user(argp, &flag, sizeof(flag)))
            {
                return -EFAULT;
            }
            break;
        }
        case ECS_IOCTL_APP_SET_PFLAG:
        {
            if (copy_from_user(&flag, argp, sizeof(flag)))
            {
                return -EFAULT;
            }
            printk(KERN_ERR "%s:into ps_set \n", __func__);
            atomic_set(&p_flag, flag);
            set_flag = atomic_read(&p_flag) ? 1 : 0;		
			if (set_flag)
			{
				ret = ltr558_ps_enable(ltr_this_data,ps_gainrange);
                if (ret < 0)
                {
                    printk(KERN_ERR "%s:enable TLR558 ps failed . error(%d)!\n", __func__,ret);
                }  
			}
			else
			{
				ret = ltr558_ps_disable(ltr_this_data);
                if (ret < 0)
                {
                    printk(KERN_ERR "%s:LTR set ECS_IOCTL_APP_SET_PFLAG flag is error(%d)!", __func__, ret);
                }

			}
            break;
        }
        case ECS_IOCTL_APP_GET_PFLAG:
        {
            flag = atomic_read(&p_flag);
            printk(KERN_ERR "%s:get ps flag\n", __func__);
            if (copy_to_user(argp, &flag, sizeof(flag)))
            {
                return -EFAULT;
            }
            break;
        }
        case ECS_IOCTL_APP_SET_DELAY:
        {
            printk(KERN_ERR "%s:set delay", __func__);
            if (copy_from_user(&flag, argp, sizeof(flag)))
            {
                return -EFAULT;
            }
            if(flag)
                ltr_558_delay = flag;
            else
                ltr_558_delay = 20;/*20ms*/
            break;
            
        }
        case ECS_IOCTL_APP_GET_DELAY:
        {
            
            flag = ltr_558_delay;
            if (copy_to_user(argp, &flag, sizeof(flag)))
            {
                return -EFAULT;
            }
            break;
            
        }
        default:
        {
            break;
        }
    }
    return ret;
    
}