summaryrefslogtreecommitdiff
path: root/v4l/scripts
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@infradead.org>2006-06-11 17:58:04 -0300
committerMauro Carvalho Chehab <mchehab@infradead.org>2006-06-11 17:58:04 -0300
commitda2ce09c5417a5fe750ac5310d6e518bdc5bba49 (patch)
treeff46e3f2e6cba83ccf725b0ee485b6428e68f55c /v4l/scripts
parentc0e1a168c8871c030502120b0f02fda348e14db7 (diff)
parent49e6c586ba2502f5cdce194081b3b9cfb590efec (diff)
downloadmediapointer-dvb-s2-da2ce09c5417a5fe750ac5310d6e518bdc5bba49.tar.gz
mediapointer-dvb-s2-da2ce09c5417a5fe750ac5310d6e518bdc5bba49.tar.bz2
merge: http://linuxtv.org/hg/~mcisely/v4l-dvb
From: Mauro Carvalho Chehab <mchehab@infradead.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'v4l/scripts')
-rwxr-xr-xv4l/scripts/insmod.sh307
-rwxr-xr-xv4l/scripts/make_kconfig.pl149
-rwxr-xr-xv4l/scripts/make_noconfig.pl57
-rwxr-xr-xv4l/scripts/rmmod.pl195
4 files changed, 325 insertions, 383 deletions
diff --git a/v4l/scripts/insmod.sh b/v4l/scripts/insmod.sh
deleted file mode 100755
index 91b4558e3..000000000
--- a/v4l/scripts/insmod.sh
+++ /dev/null
@@ -1,307 +0,0 @@
-#!/bin/sh
-# insmod modules from current directory without having to install them first
-
-sync
-
-case "$1" in
- load)
- echo "Inserting V4L/DVB modules into kernel"
- modprobe i2c-core
- modprobe crc32
- modprobe firmware_class
- # make sure input stuff is there for IR remote controls
- modprobe evdev
- # video4linux
- insmod ./compat_ioctl32.ko
- insmod ./videodev.ko
- insmod ./v4l1-compat.ko
- insmod ./v4l2-common.ko
- insmod ./video-buf.ko
- insmod ./ir-common.ko
- insmod ./ir-kbd-i2c.ko
- insmod ./tuner.ko
- insmod ./tda9887.ko
- insmod ./tvaudio.ko
- insmod ./tveeprom.ko
- insmod ./tvmixer.ko
- insmod ./cs53l32a.ko
- insmod ./wm8775.ko
- insmod ./cx25840.ko
- insmod ./saa7115.ko
- insmod ./btcx-risc.ko
- insmod ./saa7127.ko
- insmod ./msp3400.ko
- insmod ./tvp5150.ko
- insmod ./tda7432.ko
- insmod ./tda9840.ko
- insmod ./tda9875.ko
- insmod ./tea6415c.ko
- insmod ./tea6420.ko
- # DVB core
- insmod ./dvb-core.ko # dvb_net_debug=1
- # for hybrid cx88 and saa7134 cards
- insmod ./video-buf-dvb.ko
- # frontend drivers
- insmod ./dvb-pll.ko
- insmod ./ves1x93.ko
- insmod ./sp8870.ko
- insmod ./cx22700.ko
- insmod ./stv0299.ko
- insmod ./ves1820.ko
- insmod ./tda1004x.ko
- insmod ./tda10021.ko
- insmod ./dib3000-common.ko
- insmod ./dib3000mb.ko
- insmod ./dib3000mc.ko
- insmod ./l64781.ko
- insmod ./tda8083.ko
- insmod ./cx24110.ko
- insmod ./cx24123.ko
- insmod ./cx22702.ko
- insmod ./mt312.ko
- insmod ./mt352.ko
- insmod ./stv0297.ko
- insmod ./nxt200x.ko
- insmod ./lgdt330x.ko
- insmod ./nxt6000.ko
- insmod ./bcm3510.ko
- insmod ./s5h1420.ko
- insmod ./sp887x.ko
- insmod ./or51211.ko
- insmod ./or51132.ko
- insmod ./zl10353.ko
- insmod ./ttusbdecfe.ko
-
- # saa7146 based siemens/technotrend/hauppauge cards
- insmod ./saa7146.ko
- insmod ./saa7146_vv.ko
- insmod ./ttpci-eeprom.ko
- insmod ./dvb-ttpci.ko
- insmod ./budget-core.ko
- insmod ./budget.ko
- insmod ./budget-ci.ko
- insmod ./budget-av.ko
- insmod ./mxb.ko
- insmod ./hexium_gemini.ko
- insmod ./hexium_orion.ko
- # technotrend/hauppauge USB things
- insmod ./dvb-ttusb-budget.ko
- insmod ./ttusb_dec.ko
-
- # technisat skystar2
- insmod ./stv0297_cs2.ko
- insmod ./b2c2-flexcop.ko
- insmod ./b2c2-flexcop-usb.ko
- insmod ./b2c2-flexcop-pci.ko
- # terratec CinergyT2
- insmod ./cinergyT2.ko
-
- insmod ./dvb-usb.ko
- insmod ./dvb-usb-gp8psk.ko
- insmod ./dvb-usb-vp7045.ko
- insmod ./dvb-usb-dtt200u.ko
-
- insmod ./dvb-usb-dibusb-common.ko
- insmod ./dvb-usb-dibusb-mb.ko
- insmod ./dvb-usb-dibusb-mc.ko
- insmod ./dvb-usb-a800.ko
- insmod ./dvb-usb-nova-t-usb2.ko
- insmod ./dvb-usb-umt-010.ko
- insmod ./dvb-usb-digitv.ko
- insmod ./dvb-usb-cxusb.ko
- # bt8xx
- insmod ./bt832.ko
- insmod ./bttv.ko
- insmod ./bt878.ko
- insmod ./dst.ko
- insmod ./dst_ca.ko
- insmod ./dvb-bt8xx.ko
- insmod ./saa6588.ko
- # conexant cx2388x
- insmod ./cx88xx.ko
- insmod ./cx8800.ko
- insmod ./cx8802.ko
- insmod ./cx88-vp3054-i2c.ko
- insmod ./cx88-dvb.ko
- insmod ./cx88-blackbird.ko
- insmod ./cx88-alsa.ko
- # phillips saa713x
- insmod ./saa7134.ko
- insmod ./saa7134-alsa.ko
-# insmod ./saa7134-oss.ko
- insmod ./saa7134-dvb.ko
- insmod ./saa7134-empress.ko
- insmod ./saa6752hs.ko
-
- insmod ./em28xx.ko
- insmod ./pvrusb2.ko
- insmod ./cpia2.ko
- insmod ./vivi.ko
-
- echo
- ;;
- debug)
- echo "Inserting V4L/DVB modules (debug) into kernel"
- modprobe i2c-core
- modprobe crc32
- modprobe firmware_class
- modprobe evdev
- insmod ./compat_ioctl32.ko
- insmod ./videodev.ko
- insmod ./v4l1-compat.ko
- insmod ./v4l2-common.ko
- insmod ./video-buf.ko
- insmod ./ir-common.ko
- insmod ./ir-kbd-i2c.ko
- insmod ./tuner.ko tuner_debug=1
- insmod ./tda9887.ko
- insmod ./tvaudio.ko
- insmod ./tveeprom.ko
- insmod ./tvmixer.ko
- insmod ./cs53l32a.ko
- insmod ./wm8775.ko
- insmod ./cx25840.ko
- insmod ./saa7115.ko
- insmod ./btcx-risc.ko
- insmod ./saa7127.ko
- insmod ./msp3400.ko
- insmod ./tvp5150.ko
- insmod ./tda7432.ko
- insmod ./tda9840.ko
- insmod ./tda9875.ko
- insmod ./tea6415c.ko
- insmod ./tea6420.ko
- insmod ./dvb-core.ko cam_debug=1
- insmod ./video-buf-dvb.ko
- insmod ./dvb-pll.ko
- insmod ./ves1x93.ko
- insmod ./sp8870.ko
- insmod ./cx22700.ko
- insmod ./stv0299.ko
- insmod ./ves1820.ko
- insmod ./tda1004x.ko
- insmod ./tda10021.ko
- insmod ./dib3000-common.ko
- insmod ./dib3000mb.ko
- insmod ./dib3000mc.ko
- insmod ./l64781.ko
- insmod ./stv0297.ko
- insmod ./tda8083.ko
- insmod ./cx24110.ko
- insmod ./cx24123.ko
- insmod ./mt312.ko
- insmod ./mt352.ko
- insmod ./cx22702.ko
- insmod ./nxt200x.ko
- insmod ./lgdt330x.ko
- insmod ./nxt6000.ko
- insmod ./bcm3510.ko
- insmod ./s5h1420.ko
- insmod ./sp887x.ko
- insmod ./or51211.ko
- insmod ./or51132.ko
- insmod ./zl10353.ko
- insmod ./ttusbdecfe.ko
- insmod ./saa7146.ko
- insmod ./saa7146_vv.ko
- insmod ./ttpci-eeprom.ko
- insmod ./dvb-ttpci.ko debug=247
- insmod ./budget-core.ko
- insmod ./budget.ko
- insmod ./budget-ci.ko
- insmod ./budget-av.ko
- insmod ./mxb.ko
- insmod ./hexium_gemini.ko
- insmod ./hexium_orion.ko
- insmod ./dvb-ttusb-budget.ko
- insmod ./stv0297_cs2.ko
- insmod ./b2c2-flexcop.ko debug=0x01
- insmod ./b2c2-flexcop-usb.ko debug=0x01
- insmod ./b2c2-flexcop-pci.ko debug=0x01
- insmod ./ttusb_dec.ko
- insmod ./cinergyT2.ko
-
- insmod ./dvb-usb.ko debug=0x33
- insmod ./dvb-usb-gp8psk.ko debug=0x03
- insmod ./dvb-usb-vp7045.ko debug=0x03
- insmod ./dvb-usb-dtt200u.ko debug=0x03
-
- insmod ./dvb-usb-dibusb-common.ko debug=0x03
- insmod ./dvb-usb-dibusb-mb.ko
- insmod ./dvb-usb-dibusb-mc.ko
- insmod ./dvb-usb-a800.ko
- insmod ./dvb-usb-nova-t-usb2.ko
- insmod ./dvb-usb-umt-010.ko
- insmod ./dvb-usb-digitv.ko
- insmod ./dvb-usb-cxusb.ko
-
- insmod ./bt832.ko
- insmod ./bttv.ko
- insmod ./bt878.ko
- insmod ./dst.ko
- insmod ./dst_ca.ko
- insmod ./dvb-bt8xx.ko
- insmod ./saa6588.ko
-
- insmod ./cx88xx.ko
- insmod ./cx8800.ko
- insmod ./cx8802.ko
- insmod ./cx88-vp3054-i2c.ko
- insmod ./cx88-dvb.ko
- insmod ./cx88-blackbird.ko
- insmod ./cx88-alsa.ko
-
- insmod ./saa7134.ko
- insmod ./saa7134-alsa.ko
- insmod ./saa7134-oss.ko
- insmod ./saa7134-dvb.ko
- insmod ./saa7134-empress.ko
- insmod ./saa6752hs.ko
-
- insmod ./em28xx.ko
- insmod ./pvrusb2.ko
- insmod ./cpia2.ko
- insmod ./vivi.ko
- echo
- ;;
- unload)
- echo "Removing V4L/DVB modules from kernel"
- rmmod b2c2-flexcop-usb b2c2-flexcop-pci b2c2-flexcop dvb-ttpci budget \
- budget-av budget-ci budget-core ttusb_dec dvb-ttusb-budget \
- ttpci-eeprom dvb-usb-nova-t-usb2.ko dvb-usb-a800.ko \
- dvb-usb-umt-010.ko dvb-usb-dibusb-mc.ko dvb-usb-dibusb-mb.ko\
- dvb-usb-dibusb-common.ko dvb-usb-gp8psk.ko dvb-usb-vp7045.ko \
- dvb-usb-dtt200u.ko dvb-usb-digitv.ko dvb-usb-cxusb.ko \
- dvb-usb.ko
-# video4linux cards
- rmmod cx88-alsa cx88-blackbird cx88-dvb cx88-vp3054-i2c cx8802 cx8800 \
- cx88xx saa7134-oss saa7134-alsa saa7134-empress saa7134-dvb \
- saa7134 dvb-bt8xx dst_ca dst bt878 bttv bt832 mxb \
- hexium_gemini hexium_orion em28xx pvrusb2 cpia2 vivi
-
-# frontends
- rmmod dib3000mb zl10353 dib3000mc dib3000_common nxt200x ves1x93 \
- sp8870 cx22700 stv0299 ves1820 cinergyT2 ttusbdecfe \
- tda1004x l64781 tda8083 cx24110 cx22702 stv0297 \
- tda10021 mt352 mt312 bcm3510 s5h1420 nxt6000 \
- stv0297_cs2 lgdt330x cx24123 sp887x or51211 or51132 \
- dvb-pll
-
-# chips and helpers
- rmmod saa7127 msp3400 tvp5150 tda7432 tda9840 tda9875 tea6415c tea6420 \
- saa6752hs saa6588 btcx-risc tveeprom tvaudio tda9887 tuner \
- ir-kbd-i2c ir-common cx25840 tvmixer cs53l32a wm8775 saa7115 \
- saa7146_vv saa7146 video-buf-dvb video-buf \
- v4l2-common v4l1-compat dvb-core videodev compat_ioctl32
-
- echo
- ;;
- reload)
- $0 unload && $0 load
- ;;
- *)
- echo "Usage$0 {load|unload|debug|reload}"
- exit 1
-esac
-
-sync
diff --git a/v4l/scripts/make_kconfig.pl b/v4l/scripts/make_kconfig.pl
index a95e4512a..0d396c8f4 100755
--- a/v4l/scripts/make_kconfig.pl
+++ b/v4l/scripts/make_kconfig.pl
@@ -14,6 +14,7 @@ sub add_bool($)
{
my $arg=shift;
+ exists $config{$arg} or die "Adding unknown boolean '$arg'";
$tristate{$arg}="bool";
# printf "Boolean:%s\n",$arg;
}
@@ -22,13 +23,17 @@ sub add_tristate($)
{
my $arg=shift;
+ exists $config{$arg} or die "Adding unknown tristate '$arg'";
$tristate{$arg}="tristate";
# printf "Tristate:%s\n",$arg;
}
sub add_int($)
{
- $intopt{$_[0]} = '0';
+ my $arg=shift;
+
+ exists $config{$arg} or die "Adding unknown int '$arg'";
+ $intopt{$arg} = 0;
}
sub set_int_value($$)
@@ -36,6 +41,7 @@ sub set_int_value($$)
my $key = shift;
my $val = shift;
+ exists $intopt{$key} or die "Default for unknown int option '$key'";
$intopt{$key} = $val;
}
@@ -43,11 +49,22 @@ sub add_config($)
{
my $arg=shift;
- if ($arg =~ m/^([A-Z0-9_]+)/) {
+ if ($arg =~ m/^(\w+)/) {
+ # Have option default to 'on'
$config{$1} = 1;
+ } else {
+ die "Do not understand config variable '$arg'";
}
}
+# Turn option off, iff it already exists
+sub disable_config($)
+{
+ my $key = shift;
+
+ $config{$key} = 0 if (exists $config{$key});
+}
+
sub check_deps($)
{
my $arg=shift;
@@ -66,7 +83,7 @@ sub check_deps($)
sub open_kconfig($$) {
my ($dir,$file)=@_;
my $in = new FileHandle;
- my $skip=0;
+ my $disabled=0;
my $key;
#print "opening $file\n";
@@ -75,29 +92,64 @@ sub open_kconfig($$) {
# if (m;^\s*source[\s\"]+drivers/media/(video|dvb)/Kconfig;) {
# next;
# }
- if (m|^\s*source[\s\"]+([^\n\s\"]+)[\n\s\"]|) {
+
+ # start of a new stanza, reset
+ if (m/^\w/) {
+ $disabled = 0;
+ $default_seen = 0;
+ $key = undef;
+ }
+
+ if (m|^\s*source\s+"([^"]+)"\s*$| ||
+ m|^\s*source\s+(\S+)\s*$|) {
open_kconfig($dir,"$dir/$1");
next;
}
- if (m|^\s+depends on (.*)\n|) {
+ if (m|^\s+depends on\s+(.*)\n|) {
check_deps ($1);
}
- if (m|^\s+select (.*)\n|) {
+ if (m|^\s+select\s+(.*)\n|) {
check_deps ($1);
}
- if (m|^\s*bool\s+|) {
+ if (m|^\s+bool(ean)?\s|) {
add_bool($key);
}
- if (m|^\s*tristate\s+|) {
+ if (m|^\s+tristate\s|) {
add_tristate($key);
}
- if (m|^\s*int\s|) {
+ if (m|^\s+int\s|) {
+ add_int($key);
+ }
+ if (m|^\s+hex\s|) {
add_int($key);
}
- if (m|^\s*default "(\d+)"| && exists $intopt{$key}) {
+ # Get default for int options
+ if (m|^\s+default "(\d+)"| && exists $intopt{$key}) {
set_int_value($key, $1);
}
- if (m|^\s*config (.*)\n|) {
+ # Override default for disabled tri/bool options
+ if (m/^\s+default (y|n|m|"yes"|"no")\s+(if .*)?$/ &&
+ exists $tristate{$key} && $disabled) {
+ $default_seen = 1;
+ $_ = "\tdefault n\n";
+ }
+
+ # check for end of config definition for disabled drivers
+ # we need to make sure we've disabled it, and add a bit
+ # to the help text
+ if (m|^\s*(---)?help(---)?\s*$| && $disabled) {
+ print OUT "\tdefault n\n" unless($default_seen);
+ print OUT <<"EOF";
+ depends on VIDEO_KERNEL_VERSION
+ help
+ WARNING! This driver needs at least kernel $minver{$key}! It may not
+ compile or work correctly on your kernel, which is too old.
+
+EOF
+ next;
+ }
+
+ if (m|^\s*config (\w+)\s*$|) {
$key=$1;
add_config ($1);
@@ -110,27 +162,22 @@ sub open_kconfig($$) {
} else {
die "Minimum version for $key not found at versions.txt";
}
- if ( ($version < $minversion) |
- ($level < $minlevel) |
+ if ( ($version < $minversion) ||
+ ($level < $minlevel) ||
($sublevel < $minsublevel) ) {
- $skip=1;
- printf "$key requires version $minversion.$minlevel.$minsublevel\n";
-
- print OUT "# $key disabled due to incorrect version\nconfig $key\n\ttristate\n\tdefault n\n\n";
- next;
+ $disabled=1;
+ disable_config ($key);
+ print "$key requires version $minversion.$minlevel.$minsublevel\n";
+ print OUT "# $key disabled for insufficient kernel version\n";
} else {
-# printf "OK: $key requires version $minversion.$minlevel.$minsublevel\n";
- $skip=0;
+# print "OK: $key requires version $minversion.$minlevel.$minsublevel\n";
+ $disabled=0;
}
}
s/^main(menu\s\"[^\"]+)/\1 - DON'T CHANGE IT!/;
- if (m/^[\w]/) {
- $skip=0;
- }
- if (!$skip) {
- print OUT $_;
- }
+
+ print OUT $_;
}
close $in;
}
@@ -170,9 +217,31 @@ close IN;
printf "Preparing to compile for kernel version %d.%d.%d\n",$version,$level,$sublevel;
open OUT,">Kconfig";
-print OUT "mainmenu \"V4L/DVB menu\"\n";
-print OUT "source Kconfig.kern\n";
+print OUT <<"EOF";
+mainmenu "V4L/DVB menu"
+source Kconfig.kern
+config VIDEO_KERNEL_VERSION
+ bool "Enable drivers not supported by this kernel"
+ default n
+ ---help---
+ Normally drivers that require a kernel newer $version.$level.$sublevel,
+ the kernel you are compiling for now, will be disabled.
+
+ Turning this switch on will let you enabled them, but be warned
+ they may not work properly or even compile.
+
+ They may also work fine, and the only reason they are listed as
+ requiring a newer kernel is that no one has tested them with an
+ older one yet.
+
+ If the driver works, please post a report at V4L mailing list:
+ video4linux-list\@redhat.com.
+
+ Unless you know what you are doing, you should answer N.
+
+EOF
+
open_kconfig ("../linux","../linux/drivers/media/Kconfig");
close OUT;
@@ -183,26 +252,28 @@ while ( my ($key, $value) = each(%config) ) {
open OUT,">Kconfig.kern";
print OUT "config MODULES\n\tboolean\n\tdefault y\n\n";
-$tristate{"MODULES"}="bool";
+add_config('MODULES');
+add_bool('MODULES');
while ( my ($key, $value) = each(%depend) ) {
print OUT "# $key with $value refs\nconfig $key\n\ttristate\n\tdefault m\n\n";
}
close OUT;
+# These options should default to off
+disable_config('DVB_AV7110_FIRMWARE');
+disable_config('DVB_CINERGYT2_TUNING');
+
+# Produce a .config file if it's forced or one doesn't already exist
if (($force_kconfig eq 1) || !open IN,".config") {
open OUT,">.config";
while ( my ($key,$value) = each(%tristate) ) {
-
- if ( ($key eq "DVB_AV7110_FIRMWARE") ||
- ($key eq "DVB_CINERGYT2_TUNING") ) {
- printf OUT "CONFIG_%s=n\n",$key;
- } else {
- if ($value eq "tristate") {
- printf OUT "CONFIG_%s=m\n",$key;
- } else {
- printf OUT "CONFIG_%s=y\n",$key;
- }
+ if (!$config{$key}) {
+ print OUT "CONFIG_$key=n\n";
+ } elsif ($value eq 'tristate') {
+ print OUT "CONFIG_$key=m\n";
+ } else { # must be 'bool'
+ print OUT "CONFIG_$key=y\n";
}
}
while ( my ($key,$value) = each(%intopt) ) {
diff --git a/v4l/scripts/make_noconfig.pl b/v4l/scripts/make_noconfig.pl
index a81e157e2..cb3ea9627 100755
--- a/v4l/scripts/make_noconfig.pl
+++ b/v4l/scripts/make_noconfig.pl
@@ -1,57 +1,40 @@
#!/usr/bin/perl
-my $config = ();
+my %config = ();
+my %allconfig = ();
open IN,".config";
while (<IN>) {
- if (m/\s*([\d\w_]+)[=](.*)\n/) {
+ if (m/\s*(\w+)=\s*(\S*)/) {
#printf "%s=%s\n",$1,$2;
$config { $1 } = $2;
}
}
close IN;
-open IN,".version";
+# Build table of _all_ bool and tristate config variables
+open IN,"Kconfig";
while (<IN>) {
- if (m/KERNELRELEASE\s*[:]*[=]+\s*(\d+)\.(\d+)\.(\d+)/) {
- $version=$1;
- $level=$2;
- $sublevel=$3;
- }
-}
-close IN;
-
-open IN,"versions.txt";
-while (<IN>) {
- if (m/\[(\d+)\.(\d+)\.(\d+)\]/) {
- $minversion=$1;
- $minlevel=$2;
- $minsublevel=$3;
- next;
- }
- s/\n//;
-
- if (m/DVB_AV7110_FIRMWARE_FILE/) {
- next;
- }
- if (m/^\s*([\w\d_]+)/) {
- if ( ($version < $minversion) |
- ($level < $minlevel) |
- ($sublevel < $minsublevel) ) {
- $config { "CONFIG_$1" } = 'n';
-#print "CONFIG_$1 version is not supported\n";
- next;
- }
- if (!($config { "CONFIG_$1" } ) ) {
-print "CONFIG_$1 is unset\n";
- $config { "CONFIG_$1" } = 'n';
- }
+ if (/^config\s+(\w+)\s*$/) {
+ $key = "CONFIG_$1";
+ } elsif (/^\s+bool(ean)?\s/) {
+ $allconfig{$key} = 'bool';
+ $key = 0;
+ } elsif (/^\s+tristate\s/) {
+ $allconfig{$key} = 'tristate';
+ $key = 0;
}
+ # else, must be int or string, ignore
}
close IN;
+exists $allconfig{0} and die "Unable to correctly parse Kconfig file";
+
+# Produce output for including in a Makefile
+# Explicitly set options that didn't appear in .config to n
open OUT,">.myconfig";
-while ( my ($key, $value) = each(%config) ) {
+while ( my ($key, $value) = each(%allconfig) ) {
+ $value = exists $config{$key} ? $config{$key} : 'n';
printf OUT "%-44s := %s\n",$key,$value;
}
close OUT;
diff --git a/v4l/scripts/rmmod.pl b/v4l/scripts/rmmod.pl
new file mode 100755
index 000000000..eb8f02d14
--- /dev/null
+++ b/v4l/scripts/rmmod.pl
@@ -0,0 +1,195 @@
+#!/usr/bin/perl
+use strict;
+use File::Find;
+
+my %depend = ();
+my %depend2 = ();
+my %rmlist = ();
+my @nodep;
+my @modlist;
+my @allmodules;
+my %reqmodules;
+my %loaded = ();
+my $i=0;
+
+# Device debug parameters
+# Module name Debug option
+my %debug = ( "tuner" => "tuner_debug=1",
+ "dvb-core" => "cam_debug=1",
+ "dvb-ttpci" => "debug=247",
+ "b2c2-flexcop" => "debug=0x01",
+ "b2c2-flexcop-usb" => "debug=0x01",
+ "b2c2-flexcop-pci" => "debug=0x01",
+ "dvb-usb" => "debug=0x33",
+ "dvb-usb-gp8psk" => "debug=0x03",
+ "dvb-usb-vp7045" => "debug=0x03",
+ "dvb-usb-dtt200u" => "debug=0x03",
+ "dvb-usb-dibusb-common" => "debug=0x03",
+ );
+
+
+sub parse_dir {
+ my $file = $File::Find::name;
+
+ if (!($file =~ /[.]ko$/)) {
+ return;
+ }
+
+ my $module = $file;
+ $module =~ s|^[./]*(.*)[.]ko|\1|;
+
+ open IN, "modinfo $file|grep depends|cut -b 17-|";
+ while (<IN>) {
+ my $deps = $_;
+ $deps =~ s/\n//;
+ $deps =~ s/[,]/ /g;
+ $deps = " $deps ";
+ $depend{$module} = $deps;
+ push @allmodules, $module;
+ $i++;
+ }
+ close IN;
+}
+
+sub parse_loaded {
+ open IN, "/proc/modules";
+ while (<IN>) {
+ m/^([\w\d_-]+)/;
+ $loaded{$1}=1;
+ }
+ close IN;
+}
+
+sub cleandep()
+{
+ my $dep;
+
+ while ( my ($k, $v) = each(%depend) ) {
+ my $arg=$v;
+ my $arg2=" ";
+ while (!($arg =~ m/^\s*$/)) {
+ if ($arg =~ m/^ ([^ ]+) /) {
+ my $val=$1;
+ if (exists($depend{$val})) {
+ $arg2="$arg2 $val ";
+ } else {
+ $reqmodules{$val}=1;
+ }
+ }
+ $arg =~ s/^ [^ ]+//;
+ $arg2 =~ s/\s\s+/ /;
+ }
+ $depend2 { $k } = $arg2;
+ }
+
+}
+
+sub rmdep()
+{
+ my $dep;
+
+ while ($dep=pop @nodep) {
+ while ( my ($k, $v) = each(%depend2) ) {
+ if ($v =~ m/\s($dep)\s/) {
+ $v =~ s/\s${dep}\s/ /;
+ $v =~ s/\s${dep}\s/ /;
+ $v =~ s/\s${dep}\s/ /;
+ $depend2 {$k} = $v;
+ }
+ }
+ }
+}
+
+sub orderdep ()
+{
+ my $old;
+ do {
+ $old=$i;
+ while ( my ($key, $value) = each(%depend2) ) {
+ if ($value =~ m/^\s*$/) {
+ push @nodep, $key;
+ push @modlist, $key;
+ $i=$i-1;
+ delete $depend2 {$key};
+ }
+ }
+ rmdep();
+ } until ($old==$i);
+ while ( my ($key, $value) = each(%depend2) ) {
+ printf "ERROR: bad dependencies - $key ($value)\n";
+ }
+}
+
+sub insmod ($)
+{
+ my $debug=shift;
+
+ while ( my ($key, $value) = each(%reqmodules) ) {
+ printf ("modprobe $key\n");
+ system ("modprobe $key");
+ }
+
+ foreach my $key (@modlist) {
+ if ($debug) {
+ my $dbg=$debug{$key};
+
+ printf "insmod ./$key.ko $dbg\n";
+ system "insmod ./$key.ko $dbg\n";
+ } else {
+ printf "insmod ./$key.ko\n";
+ system "insmod ./$key.ko\n";
+ }
+ }
+}
+
+sub rmmod ()
+{
+ my $cmd="rmmod";
+ while (my $key=pop @modlist) {
+ my $dep=$key;
+ $dep=~s/[\-]/_/g;
+ if (exists ($loaded{$dep})) {
+ printf "$cmd ./$key.ko\n";
+ system "$cmd ./$key.ko\n";
+ }
+ }
+}
+
+sub prepare_cmd()
+{
+ find(\&parse_dir, ".");
+ printf "found $i modules\n";
+
+ cleandep();
+ orderdep();
+}
+
+# main
+my $mode=shift;
+if ($mode eq "load") {
+ prepare_cmd;
+ insmod(0);
+} else {
+ if ($mode eq "unload") {
+ prepare_cmd;
+ parse_loaded;
+ rmmod;
+ } else {
+ if ($mode eq "reload") {
+ prepare_cmd;
+ parse_loaded;
+ my @modlist2=@modlist;
+ rmmod;
+ @modlist=@modlist2;
+ insmod(0);
+ } else {
+ if ($mode eq "debug") {
+ prepare_cmd;
+ parse_loaded;
+ insmod(1);
+ } else {
+ printf "Usage: $0 [load|unload|reload]\n";
+ }
+ }
+ }
+}