[mythtv-users] StreamZap working under KnoppMyth 4RV4 (diff included)

Blammo[doh] blammo at dohboys.com
Thu Jul 29 02:43:17 EDT 2004


Well, after burning up 4 hours, I have a working StreamZap module loaded and
working against the current CVS of LIRC. Took combining 3-4 other peoples
diffs, editing what didn't work, etc..

Now I'm trying to build the lircrc for MythTV. (Anyone having one already,
send me some love!!!)

However, for what it's worth, here's my diff against the current build,
generated with:

'cvs -z3 diff -ud > blah.diff'

as suggested.

----------------------------------------------------------------------------
------------


? autom4te.cache
? stamp-h1
? drivers/lirc_streamzap
? remotes/streamzap
Index: configure.in
===================================================================
RCS file: /cvsroot/lirc/lirc/configure.in,v
retrieving revision 5.127
diff -u -d -r5.127 configure.in
--- configure.in        26 Jul 2004 15:41:25 -0000      5.127
+++ configure.in        29 Jul 2004 06:39:46 -0000
@@ -145,7 +145,7 @@
   possible_drivers="${possible_drivers} (lirc_dev lirc_serial) \
        (lirc_dev lirc_sir) (lirc_dev lirc_parallel) (lirc_dev lirc_i2c) \
        (lirc_dev lirc_gpio) (lirc_dev) (lirc_dev lirc_it87) \
-       (lirc_dev lirc_bt829) (lirc_dev lirc_atiusb) \
+       (lirc_dev lirc_bt829) (lirc_dev lirc_streamzap) (lirc_dev
lirc_atiusb) \
        (lirc_dev lirc_mceusb) (lirc_dev lirc_sasem)"
 fi

@@ -197,7 +197,7 @@
                          pctv, pixelview_bt878, pixelview_pak,
                          pixelview_pro, provideo, realmagic,
                          remotemaster, sa1100, sasem, serial, silitek,
-                         sir, slinke, tekram, tekram_bt829, tira,
+                         sir, slinke, streamzap, tekram, tekram_bt829,
tira,
                          tvbox, udp, uirt2, uirt2_raw],
 driver=${withval},
 driver="unset"
@@ -274,6 +274,8 @@
        irreal)
                #hw_module="${hw_module} hw_irreal.o serial.o receive.o
transmit.o"
                ;;
+       lirc_dev-lirc_streamzap)
+               ;;
        lirc_dev-lirc_atiusb)
                ;;
        lirc_dev-lirc_gpio)
@@ -758,6 +760,11 @@
   HW_DEFAULT="hw_slinke"
 fi

+if test "$driver" = "streamzap"; then
+  lirc_driver="lirc_dev lirc_streamzap"
+  lircd_conf="streamzap/lircd.conf.streamzap"
+fi
+
 if test "$driver" = "tekram"; then
   lirc_driver="lirc_dev lirc_sir"
   AC_DEFINE(LIRC_SIR_TEKRAM)
@@ -1048,6 +1055,7 @@
   drivers/lirc_dev/Makefile
   drivers/lirc_it87/Makefile
   drivers/lirc_bt829/Makefile
+  drivers/lirc_streamzap/Makefile
   drivers/lirc_atiusb/Makefile
   drivers/lirc_mceusb/Makefile
   drivers/lirc_sasem/Makefile
Index: setup.data
===================================================================
RCS file: /cvsroot/lirc/lirc/setup.data,v
retrieving revision 5.19
diff -u -d -r5.19 setup.data
--- setup.data  24 Jul 2004 15:36:14 -0000      5.19
+++ setup.data  29 Jul 2004 06:39:46 -0000
@@ -21,6 +21,7 @@
        livedrive_seq: "Creative LiveDrive sequencer"
        creative_infracd: "Creative iNFRA CDROM"
        bte: "Ericsson mobile phone via Bluetooth"
+       streamzap: "StreamZap PC Remote (USB)"
        devinput: "Linux input layer (/dev/input/eventX)"

 hw_menu_entry: @hw-other-serial
@@ -125,7 +126,7 @@
                hercules_smarttv_stereo it87 knc_one kworld leadtek_0007 \
                leadtek_0010 livedrive_midi livedrive_seq mceusb \
                mediafocusI none pixelview_bt878 pixelview_pak \
-               pixelview_pro provideo sa1100 sasem tekram_bt829 tvbox udp
+               pixelview_pro provideo sa1100 streamzap sasem tekram_bt829
tvbox udp
        none:

 default_param: atiusb audio audio_alsa avermedia avermedia98 \
Index: daemons/receive.c
===================================================================
RCS file: /cvsroot/lirc/lirc/daemons/receive.c,v
retrieving revision 5.20
diff -u -d -r5.20 receive.c
--- daemons/receive.c   27 Apr 2004 18:51:17 -0000      5.20
+++ daemons/receive.c   29 Jul 2004 06:39:50 -0000
@@ -55,7 +55,7 @@
                {
                        lirc_t data;

-                       data=hw.readdata(2*maxusec<50000 ? 50000:2*maxusec);
+                       data=hw.readdata(2*maxusec<500000 ?
500000:2*maxusec);
                        if(!data)
                        {
                                return 0;
Index: drivers/Makefile.am
===================================================================
RCS file: /cvsroot/lirc/lirc/drivers/Makefile.am,v
retrieving revision 5.24
diff -u -d -r5.24 Makefile.am
--- drivers/Makefile.am 19 Jun 2004 06:56:28 -0000      5.24
+++ drivers/Makefile.am 29 Jul 2004 06:39:52 -0000
@@ -8,7 +8,7 @@
 EXTRA_DIST = lirc.h kcompat.h Makefile.kernel Makefile.common

 DIST_SUBDIRS = lirc_serial lirc_parallel lirc_i2c lirc_sir lirc_dev
lirc_gpio \
-       lirc_it87 lirc_bt829 lirc_atiusb lirc_mceusb lirc_sasem
+       lirc_it87 lirc_bt829 lirc_streamzap lirc_atiusb lirc_mceusb
lirc_sasem
 SUBDIRS = @lirc_driver@

 CLEANFILES = *~
Index: drivers/lirc_dev/lirc_dev.c
===================================================================
RCS file: /cvsroot/lirc/lirc/drivers/lirc_dev/lirc_dev.c,v
retrieving revision 1.30
diff -u -d -r1.30 lirc_dev.c
--- drivers/lirc_dev/lirc_dev.c 28 Mar 2004 15:20:55 -0000      1.30
+++ drivers/lirc_dev/lirc_dev.c 29 Jul 2004 06:39:53 -0000
@@ -91,6 +91,7 @@
        struct semaphore *t_notify2;
        int shutdown;
        long jiffies_to_wait;
+       int force_unregister;

 #ifdef LIRC_HAVE_DEVFS
        devfs_handle_t devfs_handle;
@@ -99,7 +100,7 @@

 DECLARE_MUTEX(plugin_lock);

-static struct irctl irctls[MAX_IRCTL_DEVICES];
+static struct irctl *irctls[MAX_IRCTL_DEVICES];
 static struct file_operations fops;


@@ -116,6 +117,7 @@
        ir->t_notify2 = NULL;
        ir->shutdown = 0;
        ir->jiffies_to_wait = 0;
+       ir->force_unregister = 0;

        ir->open = 0;
 }
@@ -276,14 +278,14 @@
                }
        }

-       down_interruptible(&plugin_lock);
+       down(&plugin_lock);

        minor = p->minor;

        if (0 > minor) {
                /* find first free slot for plugin */
                for (minor=0; minor<MAX_IRCTL_DEVICES; minor++)
-                       if (irctls[minor].p.minor == NOPLUG)
+                       if (irctls[minor] == NULL)
                                break;
                if (MAX_IRCTL_DEVICES == minor) {
                        printk("lirc_dev: lirc_register_plugin: "
@@ -291,14 +293,16 @@
                        up(&plugin_lock);
                        return -ENOMEM;
                }
-       } else if (irctls[minor].p.minor != NOPLUG) {
+       } else if (irctls[minor] != NULL) {
                printk("lirc_dev: lirc_register_plugin:"
                       "minor (%d) just registered!\n", minor);
                up(&plugin_lock);
                return -EBUSY;
        }

-       ir = &irctls[minor];
+       ir = irctls[minor] = kmalloc(sizeof(*ir), GFP_KERNEL);
+       #warning kmalloc may fail
+       init_irctl(ir);

        if (p->sample_rate) {
                ir->jiffies_to_wait = HZ / p->sample_rate;
@@ -316,6 +320,7 @@
                ir->buf = p->rbuf;
        } else {
                ir->buf = kmalloc(sizeof(struct lirc_buffer), GFP_KERNEL);
+#warning kmalloc may fail
                lirc_buffer_init(ir->buf, bytes_in_key,
BUFLEN/bytes_in_key);
        }

@@ -361,6 +366,9 @@
 /*
  *
  */
+static void irctl_free(struct irctl *ir);
+static int do_irctl_plugin_close(struct irctl *ir);
+
 int lirc_unregister_plugin(int minor)
 {
        struct irctl *ir;
@@ -374,11 +382,11 @@
                return -EBADRQC;
        }

-       ir = &irctls[minor];
-
-       down_interruptible(&plugin_lock);
+       down(&plugin_lock);
+       ir = irctls[minor];
+       irctls[minor] = NULL;

-       if (ir->p.minor != minor) {
+       if (!ir) {
                printk("lirc_dev: lirc_unregister_plugin:"
                       "minor (%d) device not registered!", minor);
                up(&plugin_lock);
@@ -388,8 +396,15 @@
        if (ir->open) {
                printk("lirc_dev: lirc_unregister_plugin:"
                       "plugin %s[%d] in use!", ir->p.name, ir->p.minor);
-               up(&plugin_lock);
-               return -EBUSY;
+               if(ir->p.fops && ir->p.fops->release){
+                       /* we can't reliably force unregister in this case
*/
+                       up(&plugin_lock);
+                       return -EBUSY;
+               } else {
+                       do_irctl_plugin_close(ir);
+                       ir->force_unregister=1;
+                       wake_up_all(&ir->buf->wait_poll);
+               }
        }

        /* end up polling thread */
@@ -420,17 +435,25 @@
 #ifdef LIRC_HAVE_DEVFS
        devfs_unregister(ir->devfs_handle);
 #endif
+
+       if(!ir->force_unregister)
+               irctl_free(ir);
+
+       up(&plugin_lock);
+       return SUCCESS;
+}
+
+static void irctl_free(struct irctl *ir)
+{
        if (ir->buf != ir->p.rbuf){
                lirc_buffer_free(ir->buf);
                kfree(ir->buf);
        }
        ir->buf = NULL;
-       init_irctl(ir);
-       up(&plugin_lock);

-       MOD_DEC_USE_COUNT;
+       kfree(ir);

-       return SUCCESS;
+       MOD_DEC_USE_COUNT;
 }

 /*
@@ -447,23 +470,25 @@
                return -ENODEV;
        }

-       ir = &irctls[MINOR(inode->i_rdev)];
-
-       dprintk(LOGHEAD "open called\n", ir->p.name, ir->p.minor);
-
-       /* if the plugin has an open function use it instead */
-       if(ir->p.fops && ir->p.fops->open)
-               return ir->p.fops->open(inode, file);
+       if (down_interruptible(&plugin_lock)) return -ERESTARTSYS;

-       down_interruptible(&plugin_lock);
+       ir = irctls[MINOR(inode->i_rdev)];

-       if (ir->p.minor == NOPLUG) {
+       if(!ir){
                up(&plugin_lock);
                dprintk(LOGHEAD "open result = -ENODEV\n",
-                       ir->p.name, ir->p.minor);
+                       "NULL", MINOR(inode->i_rdev));
                return -ENODEV;
        }

+       dprintk(LOGHEAD "open called\n", ir->p.name, ir->p.minor);
+
+       /* if the plugin has an open function use it instead */
+       if(ir->p.fops && ir->p.fops->open){
+               up(&plugin_lock);
+               return ir->p.fops->open(inode, file);
+       }
+
        if (ir->open) {
                up(&plugin_lock);
                dprintk(LOGHEAD "open result = -EBUSY\n",
@@ -488,6 +513,7 @@
                --ir->open;
                return retval;
        }
+       file->private_data = ir;

        dprintk(LOGHEAD "open result = %d\n", ir->p.name, ir->p.minor,
SUCCESS);

@@ -499,21 +525,31 @@
  */
 static int irctl_close(struct inode *inode, struct file *file)
 {
-       struct irctl *ir = &irctls[MINOR(inode->i_rdev)];
-
+       struct irctl *ir = file->private_data;
+       int retval;
        dprintk(LOGHEAD "close called\n", ir->p.name, ir->p.minor);
+
+       if(ir->force_unregister && !ir->open) {
+               /* do_irctl_plugin_close got called already for
+                * simulating a close on the forced unregister */
+               irctl_free(ir);
+        return SUCCESS;
+    }

        /* if the plugin has a close function use it instead */
        if(ir->p.fops && ir->p.fops->release)
                return ir->p.fops->release(inode, file);

-       down_interruptible(&plugin_lock);
+       if (down_interruptible(&plugin_lock)) return -ERESTARTSYS;
+       retval = do_irctl_plugin_close(ir);
+       up(&plugin_lock);
+       return retval;
+}

+static int do_irctl_plugin_close(struct irctl *ir)
+{
        --ir->open;
        ir->p.set_use_dec(ir->p.data);
-
-       up(&plugin_lock);
-
        return SUCCESS;
 }

@@ -522,7 +558,10 @@
  */
 static unsigned int irctl_poll(struct file *file, poll_table *wait)
 {
-       struct irctl *ir = &irctls[MINOR(file->f_dentry->d_inode->i_rdev)];
+       struct irctl *ir = file->private_data;
+
+       if(ir->force_unregister)
+               return -ENODEV;

        dprintk(LOGHEAD "poll called\n", ir->p.name, ir->p.minor);

@@ -547,7 +586,10 @@
 {
        unsigned long mode;
        int result;
-       struct irctl *ir = &irctls[MINOR(inode->i_rdev)];
+       struct irctl *ir = file->private_data;
+
+       if(ir->force_unregister)
+               return -ENODEV;

        dprintk(LOGHEAD "ioctl called (%u)\n",
                ir->p.name, ir->p.minor, cmd);
@@ -618,13 +660,16 @@
                          size_t length,
                          loff_t *ppos)
 {
-       struct irctl *ir = &irctls[MINOR(file->f_dentry->d_inode->i_rdev)];
+       struct irctl *ir = file->private_data;
        unsigned char buf[ir->buf->chunk_size];
        int ret=0, written=0;
        DECLARE_WAITQUEUE(wait, current);

        dprintk(LOGHEAD "read called\n", ir->p.name, ir->p.minor);

+       if(ir->force_unregister)
+               return -ENODEV;
+
        /* if the plugin has a specific read function use it instead */
        if(ir->p.fops && ir->p.fops->read)
                return ir->p.fops->read(file, buffer, length, ppos);
@@ -646,6 +691,8 @@
         * mode and 'copy_to_user' is happy, wait for data.
         */
        while (written < length && ret == 0) {
+               if (ir->force_unregister)
+                       break;
                if (lirc_buffer_empty(ir->buf)) {
                        /* According to the read(2) man page, 'written' can
be
                         * returned as less than 'length', instead of
blocking
@@ -688,10 +735,13 @@
 static ssize_t irctl_write(struct file *file, const char *buffer,
                           size_t length, loff_t * ppos)
 {
-       struct irctl *ir = &irctls[MINOR(file->f_dentry->d_inode->i_rdev)];
+       struct irctl *ir = file->private_data;

        dprintk(LOGHEAD "read called\n", ir->p.name, ir->p.minor);

+       if(ir->force_unregister)
+               return -ENODEV;
+
        /* if the plugin has a specific read function use it instead */
        if(ir->p.fops && ir->p.fops->write)
                return ir->p.fops->write(file, buffer, length, ppos);
@@ -721,10 +771,6 @@
 {
        int i;

-       for (i=0; i < MAX_IRCTL_DEVICES; ++i) {
-               init_irctl(&irctls[i]);
-       }
-
 #ifndef LIRC_HAVE_DEVFS
        i = register_chrdev(IRCTL_DEV_MAJOR,
 #else



More information about the mythtv-users mailing list