mplayer mga_vid

適当なので注意


--- mga_vid.c 2004-04-08 00:20:06.000000000 +0900
+++ mga_vid_260.c 2004-04-08 00:21:25.000000000 +0900
@@ -1347,27 +1347,27 @@
switch(dev->device) {
case PCI_DEVICE_ID_MATROX_G550:
mga_dev_name = "MGA G550";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->pretty_name);
cards_init(card, dev, mga_cards_num - 1, 1);
break;
case PCI_DEVICE_ID_MATROX_G400:
mga_dev_name = "MGA G400/G450";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->pretty_name);
cards_init(card, dev, mga_cards_num - 1, 1);
break;
case PCI_DEVICE_ID_MATROX_G200_AGP:
mga_dev_name = "MGA G200 AGP";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->pretty_name);
cards_init(card, dev, mga_cards_num - 1, 0);
break;
case PCI_DEVICE_ID_MATROX_G200_PCI:
mga_dev_name = "MGA G200";
- printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name);
+ printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->pretty_name);
cards_init(card, dev, mga_cards_num - 1, 0);
break;
default:
mga_cards_num--;
- printk(KERN_INFO "mga_vid: ignoring matrox device (%d) at %s [%s]\n", dev->device, dev->slot_name, dev->name);

  1. printk(KERN_INFO "mga_vid: ignoring matrox device (%d) at %s [%s]\n", dev->device, dev->slot_name, dev->pretty_name);

break;
}
}
@@ -1494,7 +1494,8 @@
mga_vid_write_regs(card, 1);
card->vid_in_use = 0;

- MOD_DEC_USE_COUNT;
+ //MOD_DEC_USE_COUNT;
+ module_put(THIS_MODULE);
return 0;
}

@@ -1508,7 +1509,7 @@
mga_card_t * card;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,2)
- int minor = MINOR(inode->i_rdev.value);
+ int minor = MINOR(inode->i_rdev);
#else
int minor = MINOR(inode->i_rdev);
#endif
@@ -1539,7 +1540,17 @@
return(-EBUSY);

card->vid_in_use = 1;
- MOD_INC_USE_COUNT;
+ //MOD_INC_USE_COUNT(THIS_MODULE);
+ {
+ __unsafe(THIS_MODULE);
+
+#if defined(CONFIG_MODULE_UNLOAD) && defined(MODULE)
+ local_inc(&THIS_MODULE->ref[get_cpu()].count);
+ put_cpu();
+#else
+ (void)try_module_get(THIS_MODULE);
+#endif
+ }
return(0);
}

と変更し, -I(kernel source の場所)/include -I(kernel source の場所)/include/asm-i386/mach-default を追加し、make V=1 を参考に

gcc -Wp,-MD,.mga_vid.o.d -nostdinc -iwithprefix include -D__KERNEL__ -I/usr/src/linux/include -I/usr/src/linux/include/asm-i386/mach-default -I{kernel}/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=athlon -I/usr/src/linux/include/asm-i386/mach-default/ -O2 -fomit-frame-pointer -DMODULE -c mga_vid_260.c -DKBUILD_BASENAME=mga_vid -DKBUILD_MODNAME=mga_vid -o mga_vid.o
{kernel}/scripts/modpost mga_vid.o
gcc -Wp,-MD,.mga_vid.mod.o.d -nostdinc -iwithprefix include -D__KERNEL__ -I/usr/src/linux/include -I/usr/src/linux/include/asm-i386/mach-default -I{kernel}/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=athlon -I/usr/src/linux/include/asm-i386/mach-default/ -O2 -fomit-frame-pointer -DMODULE -I/usr/src/linux/include -I/usr/src/linux/include/asm-i386/mach-default -I{kernel}/include -DKBUILD_MODNAME=mga_vid -c -o mga_vid.mod.o mga_vid.mod.c
ld -m elf_i386 -r -o mga_vid.ko mga_vid.o mga_vid.mod.o

とするとモジュール mga_vid.ko が出来た。いちおうテストは通るがどんな問題がでるのやら。

追記 2004-05-23
mga.vid.mod.o を作る時にも-DKBUILD_MODNAME を指定しないと、lsmodで名前が出なくなったので修正 2.6.6-bk9