static void lirc_lirc_irq_handler(void *blah) { struct timeval tv; static struct timeval lasttv; static int init; long signal; int data; unsigned int level, newlevel; unsigned int timeout; if (!is_open) return; if (!is_claimed) return; #if 0 /* disable interrupt */ disable_irq(irq); out(LIRC_PORT_IRQ, in(LIRC_PORT_IRQ) & (~LP_PINTEN)); #endif if (check_pselecd && (in(1) & LP_PSELECD)) return; #ifdef LIRC_TIMER if (init) { do_gettimeofday(&tv); signal = tv.tv_sec - lasttv.tv_sec; if (signal > 15) /* really long time */ data = PULSE_MASK; else data = (int) (signal*1000000 + tv.tv_usec - lasttv.tv_usec + LIRC_SFH506_DELAY); rbuf_write(data); /* space */ } else { if (timer == 0) { /* * wake up; we'll lose this signal, but it will be * garbage if the device is turned on anyway */ timer = init_lirc_timer(); /* enable_irq(irq); */ return; } init = 1; } timeout = timer/10; /* timeout after 1/10 sec. */ signal = 1; level = lirc_get_timer(); do { newlevel = lirc_get_timer(); if (level == 0 && newlevel != 0) signal++; level = newlevel; /* giving up */ if (signal > timeout || (check_pselecd && (in(1) & LP_PSELECD))) { signal = 0; pr_notice("timeout\n"); break; } } while (lirc_get_signal()); if (signal != 0) { /* adjust value to usecs */ __u64 helper; helper = ((__u64) signal)*1000000; do_div(helper, timer); signal = (long) helper; if (signal > LIRC_SFH506_DELAY) data = signal - LIRC_SFH506_DELAY; else data = 1; rbuf_write(PULSE_BIT|data); /* pulse */ } do_gettimeofday(&lasttv); #else /* add your code here */ #endif wake_up_interruptible(&lirc_wait); /* enable interrupt */ /* enable_irq(irq); out(LIRC_PORT_IRQ, in(LIRC_PORT_IRQ)|LP_PINTEN); */ }
static void irq_handler(void *blah) { struct timeval tv; static struct timeval lasttv; static int init; long signal; int data; unsigned int level, newlevel; unsigned int timeout; if (!is_open) return; if (!is_claimed) return; #if 0 disable_irq(irq); out(LIRC_PORT_IRQ, in(LIRC_PORT_IRQ) & (~LP_PINTEN)); #endif if (check_pselecd && (in(1) & LP_PSELECD)) return; #ifdef LIRC_TIMER if (init) { do_gettimeofday(&tv); signal = tv.tv_sec - lasttv.tv_sec; if (signal > 15) data = PULSE_MASK; else data = (int) (signal*1000000 + tv.tv_usec - lasttv.tv_usec + LIRC_SFH506_DELAY); rbuf_write(data); } else { if (timer == 0) { timer = init_lirc_timer(); return; } init = 1; } timeout = timer/10; signal = 1; level = lirc_get_timer(); do { newlevel = lirc_get_timer(); if (level == 0 && newlevel != 0) signal++; level = newlevel; if (signal > timeout || (check_pselecd && (in(1) & LP_PSELECD))) { signal = 0; printk(KERN_NOTICE "%s: timeout\n", LIRC_DRIVER_NAME); break; } } while (lirc_get_signal()); if (signal != 0) { __u64 helper; helper = ((__u64) signal)*1000000; do_div(helper, timer); signal = (long) helper; if (signal > LIRC_SFH506_DELAY) data = signal - LIRC_SFH506_DELAY; else data = 1; rbuf_write(PULSE_BIT|data); } do_gettimeofday(&lasttv); #else #endif wake_up_interruptible(&lirc_wait); }