/* interpret lirc commands */ static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { int result; __u32 value; switch (cmd) { case LIRC_GET_SEND_MODE: return -ENOIOCTLCMD; break; case LIRC_SET_SEND_MODE: result = get_user(value, (__u32 *) arg); if (result) return result; /* only LIRC_MODE_PULSE supported */ if (value != LIRC_MODE_PULSE) return -ENOSYS; dprintk("Sending stuff on lirc"); break; case LIRC_GET_LENGTH: return -ENOSYS; break; case LIRC_SET_SEND_DUTY_CYCLE: result = get_user(value, (__u32 *) arg); if (result) return result; if (value <= 0 || value > 100) return -EINVAL; dprintk("SET_SEND_DUTY_CYCLE to %d \n", value); return init_timing_params(value, freq); break; case LIRC_SET_SEND_CARRIER: result = get_user(value, (__u32 *) arg); if (result) return result; if (value > 500000 || value < 20000) return -EINVAL; dprintk("SET_SEND_CARRIER to %d \n",value); return init_timing_params(duty_cycle, value); break; default: return lirc_dev_fop_ioctl(filep, cmd, arg); } return 0; }
static long ir_lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { struct lirc_codec *lirc; struct rc_dev *dev; u32 __user *argp = (u32 __user *)(arg); int ret = 0; __u32 val = 0, tmp; lirc = lirc_get_pdata(filep); if (!lirc) return -EFAULT; dev = lirc->dev; if (!dev) return -EFAULT; if (_IOC_DIR(cmd) & _IOC_WRITE) { ret = get_user(val, argp); if (ret) return ret; } switch (cmd) { /* legacy support */ case LIRC_GET_SEND_MODE: val = LIRC_CAN_SEND_PULSE & LIRC_CAN_SEND_MASK; break; case LIRC_SET_SEND_MODE: if (val != (LIRC_MODE_PULSE & LIRC_CAN_SEND_MASK)) return -EINVAL; return 0; /* TX settings */ case LIRC_SET_TRANSMITTER_MASK: if (!dev->s_tx_mask) return -ENOSYS; return dev->s_tx_mask(dev, val); case LIRC_SET_SEND_CARRIER: if (!dev->s_tx_carrier) return -ENOSYS; return dev->s_tx_carrier(dev, val); case LIRC_SET_SEND_DUTY_CYCLE: if (!dev->s_tx_duty_cycle) return -ENOSYS; if (val <= 0 || val >= 100) return -EINVAL; return dev->s_tx_duty_cycle(dev, val); /* RX settings */ case LIRC_SET_REC_CARRIER: if (!dev->s_rx_carrier_range) return -ENOSYS; if (val <= 0) return -EINVAL; return dev->s_rx_carrier_range(dev, dev->raw->lirc.carrier_low, val); case LIRC_SET_REC_CARRIER_RANGE: if (val <= 0) return -EINVAL; dev->raw->lirc.carrier_low = val; return 0; case LIRC_GET_REC_RESOLUTION: val = dev->rx_resolution; break; case LIRC_SET_WIDEBAND_RECEIVER: if (!dev->s_learning_mode) return -ENOSYS; return dev->s_learning_mode(dev, !!val); case LIRC_SET_MEASURE_CARRIER_MODE: if (!dev->s_carrier_report) return -ENOSYS; return dev->s_carrier_report(dev, !!val); /* Generic timeout support */ case LIRC_GET_MIN_TIMEOUT: if (!dev->max_timeout) return -ENOSYS; val = dev->min_timeout / 1000; break; case LIRC_GET_MAX_TIMEOUT: if (!dev->max_timeout) return -ENOSYS; val = dev->max_timeout / 1000; break; case LIRC_SET_REC_TIMEOUT: if (!dev->max_timeout) return -ENOSYS; tmp = val * 1000; if (tmp < dev->min_timeout || tmp > dev->max_timeout) return -EINVAL; dev->timeout = tmp; break; case LIRC_SET_REC_TIMEOUT_REPORTS: lirc->send_timeout_reports = !!val; break; default: return lirc_dev_fop_ioctl(filep, cmd, arg); } if (_IOC_DIR(cmd) & _IOC_READ) ret = put_user(val, argp); return ret; }
static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) #endif { int result; __u32 value; switch (cmd) { case LIRC_GET_SEND_MODE: // if (!(hardware[type].features&LIRC_CAN_SEND_MASK)) // return -ENOIOCTLCMD; // result = put_user(LIRC_SEND2MODE // (hardware[type].features&LIRC_CAN_SEND_MASK), // (__u32 *) arg); if (result) return result; break; case LIRC_SET_SEND_MODE: // if (!(hardware[type].features&LIRC_CAN_SEND_MASK)) // return -ENOIOCTLCMD; result = get_user(value, (__u32 *) arg); if (result) return result; /* only LIRC_MODE_PULSE supported */ if (value != LIRC_MODE_PULSE) return -ENOSYS; break; case LIRC_GET_LENGTH: return -ENOSYS; break; case LIRC_SET_SEND_DUTY_CYCLE: // if (!(hardware[type].features&LIRC_CAN_SET_SEND_DUTY_CYCLE)) // return -ENOIOCTLCMD; result = get_user(value, (__u32 *) arg); if (result) return result; if (value <= 0 || value > 100) return -EINVAL; return init_timing_params(value, freq); break; case LIRC_SET_SEND_CARRIER: // if (!(hardware[type].features&LIRC_CAN_SET_SEND_CARRIER)) // return -ENOIOCTLCMD; result = get_user(value, (__u32 *) arg); if (result) return result; if (value > 500000 || value < 20000) return -EINVAL; return init_timing_params(duty_cycle, value); break; default: #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35) return lirc_dev_fop_ioctl(node, filep, cmd, arg); #else return lirc_dev_fop_ioctl(filep, cmd, arg); #endif } return 0; }