4 * lirc_parallel - device driver for infra-red signal receiving and
5 * transmitting unit built by the author
7 * Copyright (C) 1998 Christoph Bartelmus <lirc@bartelmus.de>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <linux/module.h>
28 #include <linux/sched.h>
29 #include <linux/errno.h>
30 #include <linux/signal.h>
32 #include <linux/kernel.h>
33 #include <linux/ioport.h>
34 #include <linux/time.h>
36 #include <linux/delay.h>
39 #include <linux/irq.h>
40 #include <linux/uaccess.h>
41 #include <asm/div64.h>
43 #include <linux/poll.h>
44 #include <linux/parport.h>
46 #include <media/lirc.h>
47 #include <media/lirc_dev.h>
49 #include "lirc_parallel.h"
51 #define LIRC_DRIVER_NAME "lirc_parallel"
57 #define LIRC_PORT 0x378
60 #define LIRC_TIMER 65536
63 /*** Global Variables ***/
66 static int check_pselecd;
68 unsigned int irq = LIRC_IRQ;
69 unsigned int io = LIRC_PORT;
72 unsigned int default_timer = LIRC_TIMER;
75 #define RBUF_SIZE (256) /* this must be a power of 2 larger than 1 */
77 static int rbuf[RBUF_SIZE];
79 DECLARE_WAIT_QUEUE_HEAD(lirc_wait);
83 unsigned int lost_irqs;
86 struct parport *pport;
87 struct pardevice *ppdevice;
90 unsigned int tx_mask = 1;
92 /*** Internal Functions ***/
94 static unsigned int in(int offset)
98 return parport_read_data(pport);
100 return parport_read_status(pport);
101 case LIRC_LP_CONTROL:
102 return parport_read_control(pport);
104 return 0; /* make compiler happy */
107 static void out(int offset, int value)
111 parport_write_data(pport, value);
113 case LIRC_LP_CONTROL:
114 parport_write_control(pport, value);
117 printk(KERN_INFO "%s: attempt to write to status register\n",
123 static unsigned int lirc_get_timer(void)
125 return in(LIRC_PORT_TIMER) & LIRC_PORT_TIMER_BIT;
128 static unsigned int lirc_get_signal(void)
130 return in(LIRC_PORT_SIGNAL) & LIRC_PORT_SIGNAL_BIT;
133 static void lirc_on(void)
135 out(LIRC_PORT_DATA, tx_mask);
138 static void lirc_off(void)
140 out(LIRC_PORT_DATA, 0);
143 static unsigned int init_lirc_timer(void)
145 struct timeval tv, now;
146 unsigned int level, newlevel, timeelapsed, newtimer;
149 do_gettimeofday(&tv);
150 tv.tv_sec++; /* wait max. 1 sec. */
151 level = lirc_get_timer();
153 newlevel = lirc_get_timer();
154 if (level == 0 && newlevel != 0)
157 do_gettimeofday(&now);
158 } while (count < 1000 && (now.tv_sec < tv.tv_sec
159 || (now.tv_sec == tv.tv_sec
160 && now.tv_usec < tv.tv_usec)));
162 timeelapsed = ((now.tv_sec + 1 - tv.tv_sec)*1000000
163 + (now.tv_usec - tv.tv_usec));
164 if (count >= 1000 && timeelapsed > 0) {
165 if (default_timer == 0) {
166 /* autodetect timer */
167 newtimer = (1000000*count)/timeelapsed;
168 printk(KERN_INFO "%s: %u Hz timer detected\n",
169 LIRC_DRIVER_NAME, newtimer);
172 newtimer = (1000000*count)/timeelapsed;
173 if (abs(newtimer - default_timer) > default_timer/10) {
175 printk(KERN_NOTICE "%s: bad timer: %u Hz\n",
176 LIRC_DRIVER_NAME, newtimer);
177 printk(KERN_NOTICE "%s: using default timer: "
179 LIRC_DRIVER_NAME, default_timer);
180 return default_timer;
182 printk(KERN_INFO "%s: %u Hz timer detected\n",
183 LIRC_DRIVER_NAME, newtimer);
184 return newtimer; /* use detected value */
188 printk(KERN_NOTICE "%s: no timer detected\n", LIRC_DRIVER_NAME);
193 static int lirc_claim(void)
195 if (parport_claim(ppdevice) != 0) {
196 printk(KERN_WARNING "%s: could not claim port\n",
198 printk(KERN_WARNING "%s: waiting for port becoming available"
199 "\n", LIRC_DRIVER_NAME);
200 if (parport_claim_or_block(ppdevice) < 0) {
201 printk(KERN_NOTICE "%s: could not claim port, giving"
202 " up\n", LIRC_DRIVER_NAME);
206 out(LIRC_LP_CONTROL, LP_PSELECP|LP_PINITP);
211 /*** interrupt handler ***/
213 static void rbuf_write(int signal)
217 nwptr = (wptr + 1) & (RBUF_SIZE - 1);
219 /* no new signals will be accepted */
221 printk(KERN_NOTICE "%s: buffer overrun\n", LIRC_DRIVER_NAME);
228 static void irq_handler(void *blah)
231 static struct timeval lasttv;
235 unsigned int level, newlevel;
236 unsigned int timeout;
245 /* disable interrupt */
247 out(LIRC_PORT_IRQ, in(LIRC_PORT_IRQ) & (~LP_PINTEN));
249 if (check_pselecd && (in(1) & LP_PSELECD))
254 do_gettimeofday(&tv);
256 signal = tv.tv_sec - lasttv.tv_sec;
258 /* really long time */
261 data = (int) (signal*1000000 +
262 tv.tv_usec - lasttv.tv_usec +
265 rbuf_write(data); /* space */
269 * wake up; we'll lose this signal, but it will be
270 * garbage if the device is turned on anyway
272 timer = init_lirc_timer();
273 /* enable_irq(irq); */
279 timeout = timer/10; /* timeout after 1/10 sec. */
281 level = lirc_get_timer();
283 newlevel = lirc_get_timer();
284 if (level == 0 && newlevel != 0)
290 || (check_pselecd && (in(1) & LP_PSELECD))) {
292 printk(KERN_NOTICE "%s: timeout\n", LIRC_DRIVER_NAME);
295 } while (lirc_get_signal());
298 /* ajust value to usecs */
301 helper = ((__u64) signal)*1000000;
302 do_div(helper, timer);
303 signal = (long) helper;
305 if (signal > LIRC_SFH506_DELAY)
306 data = signal - LIRC_SFH506_DELAY;
309 rbuf_write(PULSE_BIT|data); /* pulse */
311 do_gettimeofday(&lasttv);
313 /* add your code here */
316 wake_up_interruptible(&lirc_wait);
318 /* enable interrupt */
321 out(LIRC_PORT_IRQ, in(LIRC_PORT_IRQ)|LP_PINTEN);
325 /*** file operations ***/
327 static loff_t lirc_lseek(struct file *filep, loff_t offset, int orig)
332 static ssize_t lirc_read(struct file *filep, char *buf, size_t n, loff_t *ppos)
336 DECLARE_WAITQUEUE(wait, current);
341 add_wait_queue(&lirc_wait, &wait);
342 set_current_state(TASK_INTERRUPTIBLE);
345 if (copy_to_user(buf+count, (char *) &rbuf[rptr],
350 rptr = (rptr + 1) & (RBUF_SIZE - 1);
351 count += sizeof(int);
353 if (filep->f_flags & O_NONBLOCK) {
357 if (signal_pending(current)) {
358 result = -ERESTARTSYS;
362 set_current_state(TASK_INTERRUPTIBLE);
365 remove_wait_queue(&lirc_wait, &wait);
366 set_current_state(TASK_RUNNING);
367 return count ? count : result;
370 static ssize_t lirc_write(struct file *filep, const char *buf, size_t n,
375 unsigned int level, newlevel;
384 count = n / sizeof(int);
386 if (n % sizeof(int) || count % 2 == 0)
389 wbuf = memdup_user(buf, n);
391 return PTR_ERR(wbuf);
395 /* try again if device is ready */
396 timer = init_lirc_timer();
403 /* adjust values from usecs */
404 for (i = 0; i < count; i++) {
407 helper = ((__u64) wbuf[i])*timer;
408 do_div(helper, 1000000);
409 wbuf[i] = (int) helper;
412 local_irq_save(flags);
415 level = lirc_get_timer();
419 newlevel = lirc_get_timer();
420 if (level == 0 && newlevel != 0)
423 if (check_pselecd && (in(1) & LP_PSELECD)) {
425 local_irq_restore(flags);
429 } while (counttimer < wbuf[i]);
437 newlevel = lirc_get_timer();
438 if (level == 0 && newlevel != 0)
441 if (check_pselecd && (in(1) & LP_PSELECD)) {
442 local_irq_restore(flags);
446 } while (counttimer < wbuf[i]);
449 local_irq_restore(flags);
451 /* place code that handles write without external timer here */
460 static unsigned int lirc_poll(struct file *file, poll_table *wait)
462 poll_wait(file, &lirc_wait, wait);
464 return POLLIN | POLLRDNORM;
468 static long lirc_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
471 __u32 features = LIRC_CAN_SET_TRANSMITTER_MASK |
472 LIRC_CAN_SEND_PULSE | LIRC_CAN_REC_MODE2;
477 case LIRC_GET_FEATURES:
478 result = put_user(features, (__u32 *) arg);
482 case LIRC_GET_SEND_MODE:
483 result = put_user(LIRC_MODE_PULSE, (__u32 *) arg);
487 case LIRC_GET_REC_MODE:
488 result = put_user(LIRC_MODE_MODE2, (__u32 *) arg);
492 case LIRC_SET_SEND_MODE:
493 result = get_user(mode, (__u32 *) arg);
496 if (mode != LIRC_MODE_PULSE)
499 case LIRC_SET_REC_MODE:
500 result = get_user(mode, (__u32 *) arg);
503 if (mode != LIRC_MODE_MODE2)
506 case LIRC_SET_TRANSMITTER_MASK:
507 result = get_user(value, (__u32 *) arg);
510 if ((value & LIRC_PARALLEL_TRANSMITTER_MASK) != value)
511 return LIRC_PARALLEL_MAX_TRANSMITTERS;
520 static int lirc_open(struct inode *node, struct file *filep)
522 if (is_open || !lirc_claim())
525 parport_enable_irq(pport);
536 static int lirc_close(struct inode *node, struct file *filep)
540 parport_release(ppdevice);
546 static const struct file_operations lirc_fops = {
547 .owner = THIS_MODULE,
548 .llseek = lirc_lseek,
552 .unlocked_ioctl = lirc_ioctl,
554 .compat_ioctl = lirc_ioctl,
557 .release = lirc_close
560 static int set_use_inc(void *data)
565 static void set_use_dec(void *data)
569 static struct lirc_driver driver = {
570 .name = LIRC_DRIVER_NAME,
576 .set_use_inc = set_use_inc,
577 .set_use_dec = set_use_dec,
580 .owner = THIS_MODULE,
583 static int pf(void *handle);
584 static void kf(void *handle);
586 static int pf(void *handle)
588 parport_disable_irq(pport);
593 static void kf(void *handle)
599 parport_enable_irq(pport);
601 /* this is a bit annoying when you actually print...*/
603 printk(KERN_INFO "%s: reclaimed port\n", LIRC_DRIVER_NAME);
607 /*** module initialization and cleanup ***/
609 static int __init lirc_parallel_init(void)
611 pport = parport_find_base(io);
613 printk(KERN_NOTICE "%s: no port at %x found\n",
614 LIRC_DRIVER_NAME, io);
617 ppdevice = parport_register_device(pport, LIRC_DRIVER_NAME,
618 pf, kf, irq_handler, 0, NULL);
619 parport_put_port(pport);
620 if (ppdevice == NULL) {
621 printk(KERN_NOTICE "%s: parport_register_device() failed\n",
625 if (parport_claim(ppdevice) != 0)
628 out(LIRC_LP_CONTROL, LP_PSELECP|LP_PINITP);
632 out(LIRC_PORT_DATA, tx_mask);
634 timer = init_lirc_timer();
636 #if 0 /* continue even if device is offline */
639 parport_release(pport);
640 parport_unregister_device(ppdevice);
646 out(LIRC_PORT_DATA, 0);
650 parport_release(ppdevice);
652 driver.minor = lirc_register_driver(&driver);
653 if (driver.minor < 0) {
654 printk(KERN_NOTICE "%s: register_chrdev() failed\n",
656 parport_unregister_device(ppdevice);
659 printk(KERN_INFO "%s: installed using port 0x%04x irq %d\n",
660 LIRC_DRIVER_NAME, io, irq);
664 static void __exit lirc_parallel_exit(void)
666 parport_unregister_device(ppdevice);
667 lirc_unregister_driver(driver.minor);
670 module_init(lirc_parallel_init);
671 module_exit(lirc_parallel_exit);
673 MODULE_DESCRIPTION("Infrared receiver driver for parallel ports.");
674 MODULE_AUTHOR("Christoph Bartelmus");
675 MODULE_LICENSE("GPL");
677 module_param(io, int, S_IRUGO);
678 MODULE_PARM_DESC(io, "I/O address base (0x3bc, 0x378 or 0x278)");
680 module_param(irq, int, S_IRUGO);
681 MODULE_PARM_DESC(irq, "Interrupt (7 or 5)");
683 module_param(tx_mask, int, S_IRUGO);
684 MODULE_PARM_DESC(tx_maxk, "Transmitter mask (default: 0x01)");
686 module_param(debug, bool, S_IRUGO | S_IWUSR);
687 MODULE_PARM_DESC(debug, "Enable debugging messages");
689 module_param(check_pselecd, bool, S_IRUGO | S_IWUSR);
690 MODULE_PARM_DESC(debug, "Check for printer (default: 0)");