static int mma7660_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; char msg[RBUFF_SIZE + 1]; int ret = -1; char rate; struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev); switch (cmd) { case MMA_IOCTL_APP_SET_RATE: if (copy_from_user(&rate, argp, sizeof(rate))) return -EFAULT; break; default: break; } switch (cmd) { case MMA_IOCTL_START: ret = mma7660_start(client, MMA7660_RATE_32); if (ret < 0) return ret; break; case MMA_IOCTL_CLOSE: ret = mma7660_close(client); if (ret < 0) return ret; break; case MMA_IOCTL_APP_SET_RATE: ret = mma7660_reset_rate(client, rate); if (ret < 0) return ret; break; /* case MMA_IOCTL_GETDATA: ret = mma7660_trans_buff(msg, RBUFF_SIZE); if (ret < 0) return ret; break; */ default: return -ENOTTY; } switch (cmd) { case MMA_IOCTL_GETDATA: if (copy_to_user(argp, &msg, sizeof(msg))) return -EFAULT; break; default: break; } return 0; }
static long mma7660_ioctl( struct file *file, unsigned int cmd,unsigned long arg) { void __user *argp = (void __user *)arg; // char msg[RBUFF_SIZE + 1]; int ret = -1; char rate; struct i2c_client *client = container_of(mma7660_device.parent, struct i2c_client, dev); WPRINTK("%s-%d: cmd = %d\n", __FUNCTION__, __LINE__, cmd); switch (cmd) { case MMA_IOCTL_APP_SET_RATE: if (copy_from_user(&rate, argp, sizeof(rate))) return -EFAULT; break; default: break; } switch (cmd) { case MMA_IOCTL_START: WPRINTK("%s-%d: start\n", __FUNCTION__, __LINE__); ret = mma7660_start(client, MMA7660_RATE_32); if (ret < 0) return ret; break; case MMA_IOCTL_CLOSE: WPRINTK("%s-%d: close\n", __FUNCTION__, __LINE__); ret = mma7660_close(client); if (ret < 0) return ret; break; case MMA_IOCTL_APP_SET_RATE: WPRINTK("%s-%d: set rate = %d\n", __FUNCTION__, __LINE__, rate); ret = mma7660_reset_rate(client, rate); if (ret < 0) return ret; break; /* case MMA_IOCTL_GETDATA: ret = mma7660_trans_buff(msg, RBUFF_SIZE); if (ret < 0) return ret; break; */ default: return -ENOTTY; } /* switch (cmd) { case MMA_IOCTL_GETDATA: WPRINTK("%s-%d: get data\n", __FUNCTION__, __LINE__); if (copy_to_user(argp, &msg, sizeof(msg))) return -EFAULT; break; default: break; }*/ return 0; }