static ssize_t yas_acc_calibration_store(struct device *dev,
                                  struct device_attribute *attr,
                                  const char *buf,
                                  size_t count)
{
    int err;
    unsigned char data_cal[3];
    struct input_dev *input = to_input_dev(dev);
    struct yas_acc_private_data *data = input_get_drvdata(input);
    struct yas_acc_data accel;
    //unsigned long enable_test = 1;
    data_cal[0] = data_cal[1] = 0;
    data_cal[2] = 1;
    
    yas_acc_measure(data->driver, &accel);
    printk("BMA222_CALIBRATION data(%10d %10d %10d) raw(%5d %5d %5d)\n",
           accel.xyz.v[0], accel.xyz.v[1], accel.xyz.v[2], accel.raw.v[0], accel.raw.v[1], accel.raw.v[2]);
    err = yas_acc_fast_calibration(data->driver, data_cal);      // calibration start
    yas_acc_measure(data->driver, &accel);
    printk("BMA222_CALIBRATION data(%10d %10d %10d) raw(%5d %5d %5d)\n",
           accel.xyz.v[0], accel.xyz.v[1], accel.xyz.v[2], accel.raw.v[0], accel.raw.v[1], accel.raw.v[2]);
    return count;
}
Esempio n. 2
0
static int yas_acc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
	int err= 0 ;
	struct yas_acc_private_data* data = gyas_acc;
	unsigned long delay_ns;
     unsigned char data_cal[3];
	struct yas_acc_data accel;
	struct yas_acc accel_data;
	switch(cmd)	{
	case YAS_IOCTL_SET_DELAY:
	//	printk("[diony] YAS_IOCTL_SET_DELAY.\n");
		if (copy_from_user(&delay_ns, (void __user *)arg,
								sizeof(delay_ns)))
				return -EFAULT;
		err = yas_acc_set_delay(data->driver, (int)delay_ns);
		break;
	case YAS_IOCTL_GET_DELAY:
	//	printk("[diony] YAS_IOCTL_GET_DELAY.\n");
		delay_ns = (unsigned long)yas_acc_get_delay(data->driver);
		if (put_user(&delay_ns, (s64 __user *) arg))
				return -EFAULT;
		break;
	case YAS_IOCTL_READ_ACCEL_XYZ:
		mutex_lock(&data->data_mutex);
		yas_acc_measure(data->driver, &accel);
		accel_data.x = accel.raw.v[0];
		accel_data.y = accel.raw.v[1];
		accel_data.z = accel.raw.v[2];
		mutex_unlock(&data->data_mutex);

		if (copy_to_user((void __user*)arg, &accel_data,
								sizeof(accel_data)))
				return -EFAULT;
		break;
	case YAS_IOCTL_CALIBRATION:
		data_cal[0] = data_cal[1] = 0;
		data_cal[2] = 1;
		mutex_lock(&data->data_mutex);
		yas_acc_measure(data->driver, &accel);
		printk("BMA222_CALIBRATION data(%10d %10d %10d) raw(%5d %5d %5d)\n",
			accel.xyz.v[0], accel.xyz.v[1], accel.xyz.v[2], accel.raw.v[0], accel.raw.v[1], accel.raw.v[2]);
		err = yas_acc_fast_calibration(data->driver, data_cal);      // calibration start
		yas_acc_measure(data->driver, &accel);
		printk("BMA222_CALIBRATION data(%10d %10d %10d) raw(%5d %5d %5d)\n",
			accel.xyz.v[0], accel.xyz.v[1], accel.xyz.v[2], accel.raw.v[0], accel.raw.v[1], accel.raw.v[2]);
		accel_data.x = accel.raw.v[0];
		accel_data.y = accel.raw.v[1];
		accel_data.z = accel.raw.v[2];
		mutex_unlock(&data->data_mutex);

		if (copy_to_user((void __user*)arg, &accel_data,
					sizeof(accel_data)))
			return -EFAULT;
		break;

	default :
		printk("[YAS] IOCTL Error !. %d \n", cmd);
		err = -EINVAL;
		break;
		}
	return err;
}