From Lundman Wiki
Jump to: navigation, search


Binary download:

ldvd-1.2.tar.gz tarball with fuse, dvdfs and fusermount
ldvd-1.1.tar.gz tarball with fuse, dvdfs and fusermount
ldvd-1.0.tar.gz tarball with fuse, dvdfs and fusermount

I downloaded the latest fuse I could find, which at the time was fuse-2.7.2.

Compiling turned out to be a real hassle, the compiled kernel version string has to match that of my compiled kernel module version string.

The string we need to get is

2.6.15-sigma preempt MIPS32_R2 32BIT gcc-4.0

So, change Makefile to have EXTRAVERSION = -sigma, then turn on preemptive kernel, and MIPS R2 under CPU Architecture. I compile the kernel with:

make V=1 CROSS_COMPILE=mipsel-linux-uclibc- ARCH=mips modules

Based on my cross-compile tool chain. However, note that Linux kernel can not easily be built on platforms other than Linux. It uses HOST_CC to build some items that assume you have Linux headers.

After that, I configured fuse with:

./configure --host=mipsel-linux-uclibc --enable-kernel-module --with-kernel=/home/lundman/cross/linux- --enable-static
cd kernel
make V=1 CROSS_COMPILE=mipsel-linux-uclibc- ARCH=mips

Which gives me a fuse.ko. This does not yet load, due to:

insmod -v fuse.ko
Using fuse.ko
fuse: Unknown symbol capable
fuse: Unknown symbol _spin_unlock
fuse: Unknown symbol add_preempt_count
fuse: Unknown symbol __might_sleep
fuse: Unknown symbol _spin_lock
fuse: Unknown symbol sub_preempt_count
insmod: cannot insert 'fuse.ko': Success (2): Success

Ahh, ok instead of picking malta board, I picked atlas and voila:

# insmod fuse3.ko
<4>fuse init (API version 7.8)
<4>fuse distribution version: 2.7.2

Due to a bug in 2.6.15, with cache coherency, fuse never ran properly. There was a work around by calling flush_cache_page but this function is missing in the running kernel. I have managed to pull it out of a similar MIPS CPU tree, and put them together with a hammer.

This is quite ugly, it only sets up the function pointers the first time that fluch_cache_page() is called, and _no other functions_. It was all I needed however.



With the fix of fuse above, DVDfs is confirmed to work correctly. However, there is not a lot of CPU to play with, and decrypting CSS in CPU is "just enough". You will probably find there are scenes with slow down however.

You will need to put dvdfs and fusermount in a directory, and change PATH to include it.

# dvdfs -o device=/dev/cdrom /opt/sybhttpd/localhost.drives/CDROM -d -s &
libdvdcss debug: opening target `/dev/cdrom'
libdvdcss debug: using libc for access
libdvdcss debug: disc is scrambled
libdvdcss debug: requesting AGID
libdvdcss debug: drive authenticated, using variant 5
libdvdcss debug: authentication established
libdvdcss debug: GetASF authenticated, ASF=1
libdvdcss debug: decrypting disc key xx:xx:xx:xx:xx
libdvdcss debug: trying player key xx:xx:xx:xx:xx
libdvdcss debug: decrypted disc key is xx:xx:xx:xx:xx
libdvdcss debug: using CSS key cache dir: /root/.dvdcss/IRON_GIANT-1999100713372400-f287af6105/
Scanning DVD ...
Scan complete!
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56
INIT: 7.8
  INIT: 7.8
  unique: 1, error: 0 (Success), outsize: 40

# ls: /opt/sybhttpd/localhost.drives/CDROM/VIDEO_TS/
-r--r--r--    1 root     root         8192 Jan  1 12:49 VIDEO_TS.IFO
-r--r--r--    1 root     root        79872 Jan  1 12:49 VTS_01_0.IFO
-r--r--r--    1 root     root     47220736 Jan  1 12:49 VTS_01_0.VOB
-r--r--r--    1 root     root   1073741824 Jan  1 12:49 VTS_01_1.VOB
-r--r--r--    1 root     root   1073741824 Jan  1 12:49 VTS_01_2.VOB
-r--r--r--    1 root     root   1041446912 Jan  1 12:49 VTS_01_3.VOB
-r--r--r--    1 root     root        36864 Jan  1 12:49 VTS_02_0.IFO
-r--r--r--    1 root     root    786161664 Jan  1 12:49 VTS_02_1.VOB