static int ecs_ctrl_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { void __user *pa = (void __user *)arg; short flag; short delay; int parms[4]; int ypr[13]; switch (cmd) { case ECOMPASS_IOC_SET_MODE: break; case ECOMPASS_IOC_SET_DELAY: if (copy_from_user(&delay, pa, sizeof(delay))) return -EFAULT; ecompass_delay = delay; break; case ECOMPASS_IOC_GET_DELAY: delay = ecompass_delay; if (copy_to_user(pa, &delay, sizeof(delay))) return -EFAULT; break; case ECOMPASS_IOC_SET_AFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&a_flag, flag); break; case ECOMPASS_IOC_GET_AFLAG: flag = atomic_read(&a_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_MFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&m_flag, flag); break; case ECOMPASS_IOC_GET_MFLAG: flag = atomic_read(&m_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_OFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&o_flag, flag); break; case ECOMPASS_IOC_GET_OFLAG: flag = atomic_read(&o_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_PFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&p_flag, flag); break; case ECOMPASS_IOC_GET_PFLAG: flag = atomic_read(&p_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_APARMS: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* acceleration x-axis */ input_set_abs_params(ecs_data_device, ABS_X, parms[0], parms[1], parms[2], parms[3]); /* acceleration y-axis */ input_set_abs_params(ecs_data_device, ABS_Y, parms[0], parms[1], parms[2], parms[3]); /* acceleration z-axis */ input_set_abs_params(ecs_data_device, ABS_Z, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_APARMS: break; case ECOMPASS_IOC_SET_MPARMS: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* magnetic raw x-axis */ input_set_abs_params(ecs_data_device, ABS_HAT0X, parms[0], parms[1], parms[2], parms[3]); /* magnetic raw y-axis */ input_set_abs_params(ecs_data_device, ABS_HAT0Y, parms[0], parms[1], parms[2], parms[3]); /* magnetic raw z-axis */ input_set_abs_params(ecs_data_device, ABS_BRAKE, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_MPARMS: break; case ECOMPASS_IOC_SET_OPARMS_YAW: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation yaw */ input_set_abs_params(ecs_data_device, ABS_RX, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_YAW: break; case ECOMPASS_IOC_SET_OPARMS_PITCH: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation pitch */ input_set_abs_params(ecs_data_device, ABS_RY, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_PITCH: break; case ECOMPASS_IOC_SET_OPARMS_ROLL: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation roll */ input_set_abs_params(ecs_data_device, ABS_RZ, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_ROLL: break; case ECOMPASS_IOC_SET_YPR: if (copy_from_user(ypr, pa, sizeof(ypr))) return -EFAULT; /* Report acceleration sensor information */ if (atomic_read(&a_flag)) { input_report_abs(ecs_data_device, ABS_X, ypr[0]); input_report_abs(ecs_data_device, ABS_Y, ypr[1]); input_report_abs(ecs_data_device, ABS_Z, ypr[2]); input_report_abs(ecs_data_device, ABS_WHEEL, ypr[3]); } /* Report magnetic sensor information */ if (atomic_read(&m_flag)) { input_report_abs(ecs_data_device, ABS_HAT0X, ypr[4]); input_report_abs(ecs_data_device, ABS_HAT0Y, ypr[5]); input_report_abs(ecs_data_device, ABS_BRAKE, ypr[6]); input_report_abs(ecs_data_device, ABS_GAS, ypr[7]); } /* Report orientation information */ if (atomic_read(&o_flag)) { input_report_abs(ecs_data_device, ABS_RX, ypr[8]); input_report_abs(ecs_data_device, ABS_RY, ypr[9]); input_report_abs(ecs_data_device, ABS_RZ, ypr[10]); input_report_abs(ecs_data_device, ABS_RUDDER, ypr[11]); } #if defined(CONFIG_MACH_CALLISTO) || (defined(CONFIG_MACH_TOTORO_CTC) && CONFIG_BOARD_REVISION >= 0x02) //twkim add proximity sensor driver to totoro_ctc /* Report proximity information */ if (atomic_read(&p_flag)) { ypr[12] = gp2a_get_proximity_value(); // printk(KERN_INFO"Mecs.c :: Proximity = %d\n", ypr[12]); input_report_abs(ecs_data_device, ABS_DISTANCE, ypr[12]); } #elif defined(CONFIG_MACH_COOPER) || defined(CONFIG_MACH_BENI) || defined(CONFIG_MACH_TASS) || defined(CONFIG_MACH_LUCAS) #ifdef CONFIG_SENSORS_TAOS /* Report proximity information */ if (atomic_read(&p_flag)) { ypr[12] = taos_get_proximity_value(); // printk(KERN_INFO"Mecs.c :: Proximity = %d\n", ypr[12]); input_report_abs(ecs_data_device, ABS_DISTANCE, ypr[12]); } #endif #endif input_sync(ecs_data_device); break; default: break; } return 0; }
/*sysfs -prox_value*/ static ssize_t gp2a_show_prox_value(struct device *dev,struct device_attribute *attr, char *buf) { u32 prox_value; prox_value = gp2a_get_proximity_value(); return sprintf(buf, "%d\n", prox_value); }
static int ecs_ctrl_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { void __user *pa = (void __user *)arg; short flag; short delay; int parms[4]; int ypr[13]; switch (cmd) { case ECOMPASS_IOC_SET_MODE: break; case ECOMPASS_IOC_SET_DELAY: if (copy_from_user(&delay, pa, sizeof(delay))) return -EFAULT; ecompass_delay = delay; break; case ECOMPASS_IOC_GET_DELAY: delay = ecompass_delay; if (copy_to_user(pa, &delay, sizeof(delay))) return -EFAULT; break; case ECOMPASS_IOC_SET_AFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&a_flag, flag); break; case ECOMPASS_IOC_GET_AFLAG: flag = atomic_read(&a_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_MFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&m_flag, flag); break; case ECOMPASS_IOC_GET_MFLAG: flag = atomic_read(&m_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_OFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&o_flag, flag); break; case ECOMPASS_IOC_GET_OFLAG: flag = atomic_read(&o_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_PFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&p_flag, flag); break; case ECOMPASS_IOC_GET_PFLAG: flag = atomic_read(&p_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; // iamaj add [[ case ECOMPASS_IOC_SET_LFLAG: if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&l_flag, flag); break; case ECOMPASS_IOC_GET_LFLAG: flag = atomic_read(&l_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; // ]] case ECOMPASS_IOC_SET_APARMS: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* acceleration x-axis */ input_set_abs_params(ecs_data_device, ABS_X, parms[0], parms[1], parms[2], parms[3]); /* acceleration y-axis */ input_set_abs_params(ecs_data_device, ABS_Y, parms[0], parms[1], parms[2], parms[3]); /* acceleration z-axis */ input_set_abs_params(ecs_data_device, ABS_Z, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_APARMS: break; case ECOMPASS_IOC_SET_MPARMS: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* magnetic raw x-axis */ input_set_abs_params(ecs_data_device, ABS_HAT0X, parms[0], parms[1], parms[2], parms[3]); /* magnetic raw y-axis */ input_set_abs_params(ecs_data_device, ABS_HAT0Y, parms[0], parms[1], parms[2], parms[3]); /* magnetic raw z-axis */ input_set_abs_params(ecs_data_device, ABS_BRAKE, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_MPARMS: break; case ECOMPASS_IOC_SET_OPARMS_YAW: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation yaw */ input_set_abs_params(ecs_data_device, ABS_RX, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_YAW: break; case ECOMPASS_IOC_SET_OPARMS_PITCH: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation pitch */ input_set_abs_params(ecs_data_device, ABS_RY, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_PITCH: break; case ECOMPASS_IOC_SET_OPARMS_ROLL: if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation roll */ input_set_abs_params(ecs_data_device, ABS_RZ, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_ROLL: break; case ECOMPASS_IOC_SET_YPR: if (copy_from_user(ypr, pa, sizeof(ypr))) return -EFAULT; /* Report acceleration sensor information */ if (atomic_read(&a_flag)) { input_report_abs(ecs_data_device, ABS_X, ypr[0]); input_report_abs(ecs_data_device, ABS_Y, ypr[1]); input_report_abs(ecs_data_device, ABS_Z, ypr[2]); input_report_abs(ecs_data_device, ABS_WHEEL, ypr[3]); } /* Report magnetic sensor information */ if (atomic_read(&m_flag)) { input_report_abs(ecs_data_device, ABS_HAT0X, ypr[4]); input_report_abs(ecs_data_device, ABS_HAT0Y, ypr[5]); input_report_abs(ecs_data_device, ABS_BRAKE, ypr[6]); input_report_abs(ecs_data_device, ABS_GAS, ypr[7]); } /* Report orientation information */ if (atomic_read(&o_flag)) { input_report_abs(ecs_data_device, ABS_RX, ypr[8]); input_report_abs(ecs_data_device, ABS_RY, ypr[9]); input_report_abs(ecs_data_device, ABS_RZ, ypr[10]); input_report_abs(ecs_data_device, ABS_RUDDER, ypr[11]); } /* Report proximity information */ if (atomic_read(&p_flag)) { #if defined (CONFIG_MACH_GIO) ypr[12] = taos_get_proximity_value(); #elif !(defined(CONFIG_MACH_VINO) || defined(CONFIG_MACH_REALITY2) || defined(CONFIG_MACH_GIOS)) pval = gp2a_get_proximity_value(); #endif #if defined (CONFIG_MACH_GIO) input_report_abs(ecs_data_device, ABS_DISTANCE, ypr[12]); #else input_report_abs(ecs_data_device, ABS_DISTANCE, pval); #endif } // iamaj add [[ #if !(defined (CONFIG_MACH_GIO) || defined (CONFIG_MACH_RANT3) || defined (CONFIG_MACH_VINO) || defined (CONFIG_MACH_GIOS)) /* Report light sensor information */ if (atomic_read(&l_flag)) { lightval = gp2a_get_light_sensor_value(); input_report_abs(ecs_data_device, ABS_PRESSURE, lightval); } #endif // ]] input_sync(ecs_data_device); break; default: break; } return 0; }
static int ecs_ctrl_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { void __user *pa = (void __user *)arg; short flag; short delay; int parms[4]; int ypr[13]; switch (cmd) { case ECOMPASS_IOC_SET_MODE: MECSDBG("[MECS] ECOMPASS_IOC_SET_MODE\n"); break; case ECOMPASS_IOC_SET_DELAY: MECSDBG("[MECS] ECOMPASS_IOC_SET_DELAY\n"); if (copy_from_user(&delay, pa, sizeof(delay))) return -EFAULT; ecompass_delay = delay; break; case ECOMPASS_IOC_GET_DELAY: MECSDBG("[MECS] ECOMPASS_IOC_GET_DELAY\n"); delay = ecompass_delay; if (copy_to_user(pa, &delay, sizeof(delay))) return -EFAULT; break; case ECOMPASS_IOC_SET_AFLAG: MECSDBG("[MECS] ECOMPASS_IOC_SET_AFLAG\n"); if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&a_flag, flag); break; case ECOMPASS_IOC_GET_AFLAG: MECSDBG("[MECS] ECOMPASS_IOC_GET_AFLAG\n"); flag = atomic_read(&a_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_MFLAG: MECSDBG("[MECS] ECOMPASS_IOC_SET_MFLAG\n"); if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&m_flag, flag); break; case ECOMPASS_IOC_GET_MFLAG: MECSDBG("[MECS] ECOMPASS_IOC_GET_MFLAG\n"); flag = atomic_read(&m_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_OFLAG: MECSDBG("[MECS] ECOMPASS_IOC_SET_OFLAG\n"); if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&o_flag, flag); break; case ECOMPASS_IOC_GET_OFLAG: MECSDBG("[MECS] ECOMPASS_IOC_GET_OFLAG\n"); flag = atomic_read(&o_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_PFLAG: MECSDBG("[MECS] ECOMPASS_IOC_SET_PFLAG\n"); if (copy_from_user(&flag, pa, sizeof(flag))) return -EFAULT; if (flag < 0 || flag > 1) return -EINVAL; atomic_set(&p_flag, flag); if(flag==1) { input_report_abs(ecs_data_device, ABS_DISTANCE, ((proximity_get_int_value() == 0)? 0:1)); input_sync(ecs_data_device); } break; case ECOMPASS_IOC_GET_PFLAG: MECSDBG("[MECS] ECOMPASS_IOC_GET_PFLAG\n"); flag = atomic_read(&p_flag); if (copy_to_user(pa, &flag, sizeof(flag))) return -EFAULT; break; case ECOMPASS_IOC_SET_APARMS: MECSDBG("[MECS] ECOMPASS_IOC_SET_APARMS\n"); if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* acceleration x-axis */ input_set_abs_params(ecs_data_device, ABS_X, parms[0], parms[1], parms[2], parms[3]); /* acceleration y-axis */ input_set_abs_params(ecs_data_device, ABS_Y, parms[0], parms[1], parms[2], parms[3]); /* acceleration z-axis */ input_set_abs_params(ecs_data_device, ABS_Z, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_APARMS: MECSDBG("[MECS] ECOMPASS_IOC_GET_APARMS\n"); break; case ECOMPASS_IOC_SET_MPARMS: MECSDBG("[MECS] ECOMPASS_IOC_SET_MPARMS\n"); if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* magnetic raw x-axis */ input_set_abs_params(ecs_data_device, ABS_HAT0X, parms[0], parms[1], parms[2], parms[3]); /* magnetic raw y-axis */ input_set_abs_params(ecs_data_device, ABS_HAT0Y, parms[0], parms[1], parms[2], parms[3]); /* magnetic raw z-axis */ input_set_abs_params(ecs_data_device, ABS_BRAKE, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_MPARMS: MECSDBG("[MECS] ECOMPASS_IOC_GET_MPARMS\n"); break; case ECOMPASS_IOC_SET_OPARMS_YAW: MECSDBG("[MECS] ECOMPASS_IOC_SET_OPARMS_YAW\n"); if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation yaw */ input_set_abs_params(ecs_data_device, ABS_RX, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_YAW: MECSDBG("[MECS] ECOMPASS_IOC_GET_OPARMS_YAW\n"); break; case ECOMPASS_IOC_SET_OPARMS_PITCH: MECSDBG("[MECS] ECOMPASS_IOC_SET_OPARMS_PITCH\n"); if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation pitch */ input_set_abs_params(ecs_data_device, ABS_RY, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_PITCH: MECSDBG("[MECS] ECOMPASS_IOC_GET_OPARMS_PITCH\n"); break; case ECOMPASS_IOC_SET_OPARMS_ROLL: MECSDBG("[MECS] ECOMPASS_IOC_SET_OPARMS_ROLL\n"); if (copy_from_user(parms, pa, sizeof(parms))) return -EFAULT; /* orientation roll */ input_set_abs_params(ecs_data_device, ABS_RZ, parms[0], parms[1], parms[2], parms[3]); break; case ECOMPASS_IOC_GET_OPARMS_ROLL: MECSDBG("[MECS] ECOMPASS_IOC_GET_OPARMS_ROLL\n"); break; case ECOMPASS_IOC_SET_YPR: MECSDBG("[MECS] ECOMPASS_IOC_SET_YPR\n"); if (copy_from_user(ypr, pa, sizeof(ypr))) return -EFAULT; /* Report acceleration sensor information */ if (atomic_read(&a_flag)) { MECSDBG("[MECS] ECOMPASS_IOC_SET_YPR a_flag\n"); input_report_abs(ecs_data_device, ABS_X, ypr[0]); input_report_abs(ecs_data_device, ABS_Y, ypr[1]); input_report_abs(ecs_data_device, ABS_Z, ypr[2]); input_report_abs(ecs_data_device, ABS_WHEEL, ypr[3]); } /* Report magnetic sensor information */ if (atomic_read(&m_flag)) { MECSDBG("[MECS] ECOMPASS_IOC_SET_YPR m_flag\n"); input_report_abs(ecs_data_device, ABS_HAT0X, ypr[4]); input_report_abs(ecs_data_device, ABS_HAT0Y, ypr[5]); input_report_abs(ecs_data_device, ABS_BRAKE, ypr[6]); input_report_abs(ecs_data_device, ABS_GAS, ypr[7]); } /* Report orientation information */ if (atomic_read(&o_flag)) { MECSDBG("[MECS] ECOMPASS_IOC_SET_YPR o_flag\n"); input_report_abs(ecs_data_device, ABS_RX, ypr[8]); input_report_abs(ecs_data_device, ABS_RY, ypr[9]); input_report_abs(ecs_data_device, ABS_RZ, ypr[10]); input_report_abs(ecs_data_device, ABS_RUDDER, ypr[11]); } /* Report proximity information */ if (atomic_read(&p_flag)) { MECSDBG("[MECS] ECOMPASS_IOC_SET_YPR p_flag\n"); #if defined(CONFIG_SENSORS_TAOS) ypr[12] = taos_get_proximity_value(); #else ypr[12] = gp2a_get_proximity_value(); #endif MECSDBG("[MECS] Proximity = %d\n", ypr[12]); input_report_abs(ecs_data_device, ABS_DISTANCE, ypr[12]); } input_sync(ecs_data_device); break; default: break; } return 0; }