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; }
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; }