Compiling and using sasc-ng and dvbloopback with Linux 2.6.38 is a hassle. Here’s how to get it working.
Prequisites:
Ubuntu Lucid
Kernel 2.6.38-11-generic
We need to patch both the kernel dvb module as well as the dvbloopback source.
Create a patch file named linux-2.6.38-dvb-mutex.patch in your home folder with the following contents:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
diff -Nur linux-2.6.38/drivers/media/dvb/dvb-core/dvbdev.c linux-2.6.38/drivers/media/dvb/dvb-core/dvbdev.c
--- linux-2.6.38/drivers/media/dvb/dvb-core/dvbdev.c
+++ linux-2.6.38/drivers/media/dvb/dvb-core/dvbdev.c
@@ -83,8 +83,11 @@ static int dvb_device_open(struct inode *inode, struct file *file)
file->f_op = old_fops;
goto fail;
}
- if(file->f_op->open)
+ if(file->f_op->open) {
+ mutex_unlock(&dvbdev_mutex);
err = file->f_op->open(inode,file);
+ mutex_lock(&dvbdev_mutex);
+ }
if (err) {
fops_put(file->f_op);
file->f_op = fops_get(old_fops);
-- |
$ sudo apt-get install linux-headers-`uname -r`
Now let’s get the kernel source, patch it, and recompile the dvb-core module.
$ cd /usr/src
$ sudo apt-get source kernel-image-`uname -r`
$ cd linux-2.6.38
$ sudo patch -p1 < ~/linux-2.6.38-dvb-mutex.patch
$ sudo make mrproper
$ sudo cp /boot/config-$(uname -r) .config
$ sudo cp /usr/src/linux-headers-`uname -r`/Module.symvers /usr/src/linux-2.6.38/
$ sudo make oldconfig
$ sudo make prepare
$ sudo make scripts
$ sudo make M=drivers/media/dvb/dvb-core
$ sudo cp /usr/src/linux-2.6.38/drivers/media/dvb/dvb-core/dvb-core.ko /lib/modules/`uname -r`/kernel/drivers/media/dvb/dvb-core/
Next, head to your sasc-ng source directory and apply the following patch
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
--- contrib/sasc-ng/dvbloopback/module/dvblb_forward.c 2011-04-25 02:44:10.511089600 +0300
+++ contrib/sasc-ng/dvbloopback/module/dvblb_forward.c 2011-04-24 21:04:17.000000000 +0300
@@ -166,9 +166,9 @@
struct file *ftmp = find_forwardmap(lbdev, f->private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
- if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->ioctl)
- return lbdev->forward_dev->fops->ioctl(
- ftmp->f_dentry->d_inode, ftmp, cmd, arg);
+ if (lbdev->forward_dev->fops &&lbdev->forward_dev->fops->unlocked_ioctl)
+ return lbdev->forward_dev->fops->unlocked_ioctl(
+ ftmp, cmd, arg);
return -EFAULT;
}</code>
--- contrib/sasc-ng/dvbloopback/module/dvb_loopback.c 2011-04-25 02:44:10.511089600 +0300
+++ contrib/sasc-ng/dvbloopback/module/dvb_loopback.c 2011-04-25 00:42:54.234135688 +0300
@@ -118,9 +118,9 @@
/* This is a copy of dvb_usercopy. We need to do this because it isn't exported
by dvbdev
*/
-static int dvblb_usercopy(struct inode *inode, struct file *file,
+static int dvblb_usercopy(struct file *file,
unsigned int cmd, unsigned long arg,
- int (*func)(struct inode *inode, struct file *file,
+ int (*func)(struct file *file,
unsigned int cmd, void *arg))
{
char sbuf[128];
@@ -180,7 +180,7 @@
}
/* call driver */
- if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD)
+ if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
err = -EINVAL;
if (err < 0)
@@ -663,7 +663,7 @@
dvb_generic_ioctl) which is called by dvblb_ioctl for device-0. It is
used to forward ioctl commands back to the userspace application
*/
-static int dvblb_looped_ioctl(struct inode *inode, struct file *f,
+static int dvblb_looped_ioctl(struct file *f,
unsigned int cmd, void *parg)
{
int ret;
@@ -692,7 +692,7 @@
return ret;
}
-static int dvblb_ioctl(struct inode *inode, struct file *f,
+static long dvblb_ioctl(struct file *f,
unsigned int cmd, unsigned long arg)
{
void * parg = (void *)arg;
@@ -723,7 +723,7 @@
if (lbdev->forward_dev)
return dvblb_forward_ioctl(lbdev, f, cmd, arg);
- return dvblb_usercopy (inode, f, cmd, arg,
+ return dvblb_usercopy (f, cmd, arg,
dvbdev->kernel_ioctl);
}
/* This is the userspace control device */
@@ -978,7 +978,7 @@
.write = dvblb_write,
.poll = dvblb_poll,
.mmap = dvblb_mmap,
- .ioctl = dvblb_ioctl,
+ .unlocked_ioctl = dvblb_ioctl,
};
static struct dvb_device dvbdev_looped = {
@@ -998,7 +998,7 @@
.write = dvblb_write,
.poll = dvblb_poll,
.mmap = dvblb_mmap,
- .ioctl = dvblb_ioctl,
+ .unlocked_ioctl = dvblb_ioctl,
};
static struct dvb_device dvbdev_userspace = {
--- contrib/sasc-ng/Makefile 2011-04-25 02:44:10.507089818 +0300
+++ contrib/sasc-ng/Makefile 2011-04-25 00:40:31.390323663 +0300
@@ -8,7 +8,7 @@
CC ?= gcc
CXX ?= g++
-CXXFLAGS ?= -Wall -D__user= -Werror
+CXXFLAGS ?= -Wall -D__user= #-Werror
CFLAGS ?= -Wall -D__user=
ifdef DVB_DIR
@@ -17,7 +17,7 @@
endif
DEFINES += -DRELEASE_VERSION=\"$(VERSION)\" -D__KERNEL_STRICT_NAMES
-INCLUDES += -Idvbloopback/module -I/lib/modules/$(shell uname -r)/build/include
+INCLUDES += -Idvbloopback/module -I/usr/include
LBDIR = dvbloopback/src
SCDIR = sc/PLUGINS/src/$(SCVER)
SC_FLAGS = -O2 -fPIC -Wall -Woverloaded-virtual
@@ -57,7 +57,7 @@
INC_DEPS := $(shell ls $(LBDIR)/*.h) dvbloopback/module/dvbloopback.h
INC_DEPS_LB := $(shell ls dvblb_plugins/*.h)
-LIBS = -lpthread -lcrypto -lcrypt
+LIBS = -lpthread -lcrypto -lcrypt -lv4l1
all: $(TOOL) libscanwrap.so
--- contrib/sasc-ng/sc/dvbdevice.cpp 2011-04-25 02:44:10.519089162 +0300
+++ contrib/sasc-ng/sc/dvbdevice.cpp 2011-04-24 21:04:17.000000000 +0300
@@ -10,7 +10,7 @@
#include "include/vdr/dvbdevice.h"
#include
#include -#include +#include #include #include #include diff -u -r systems/constcw/constcw.c systems/constcw/constcw.c
--- systems/constcw/constcw.c 2011-04-25 02:44:10.567086537 +0300
+++ systems/constcw/constcw.c 2011-04-25 02:39:59.527575519 +0300
@@ -70,7 +70,7 @@
bool cPlainKeyConstCw::Matches(const cEcmInfo *ecm)
{
- return ecm->prgId==prgId && ecm->source==source && ecm->transponder==transponder;
+ return ecm->prgId==prgId;
}
bool cPlainKeyConstCw::Parse(const char *line) |
I.e. save as sasc-2.6.38.patch in your home directory, cd to the sasc source dir and apply patch with
$ patch -p0 < ~/sasc-2.6.38.patch
Refer to the official sasc-ng installation page for more info http://dolot.kipdola.com/wiki/Install_SASC-NG
Thanks to http://www.vanbest.org/drupal6/content/installing-sasc-ng-linux-2.6.38 and http://www.eurocardsharing.com/f273/ubuntu-11-04-sasc-ng-dvbloopback-348184