dvbloopback in Linux 2.6.38

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:

C
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

C
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-&gt;private_data);
if (!ftmp || IS_ERR(ftmp))
return -EFAULT;
- if (lbdev-&gt;forward_dev-&gt;fops &amp;&amp;lbdev-&gt;forward_dev-&gt;fops-&gt;ioctl)
- return lbdev-&gt;forward_dev-&gt;fops-&gt;ioctl(
- ftmp-&gt;f_dentry-&gt;d_inode, ftmp, cmd, arg);
+ if (lbdev-&gt;forward_dev-&gt;fops &amp;&amp;lbdev-&gt;forward_dev-&gt;fops-&gt;unlocked_ioctl)
+ return lbdev-&gt;forward_dev-&gt;fops-&gt;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 &lt; 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-&gt;forward_dev)
return dvblb_forward_ioctl(lbdev, f, cmd, arg);
- return dvblb_usercopy (inode, f, cmd, arg,
+ return dvblb_usercopy (f, cmd, arg,
dvbdev-&gt;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-&gt;prgId==prgId &amp;&amp; ecm-&gt;source==source &amp;&amp; ecm-&gt;transponder==transponder;
+ return ecm-&gt;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

Leave a Reply

Why ask?