Compilation d'un module noyau

トップ ページ

このメッセージに返信
著者: Frédéric
日付:  
To: ML Guilde
題目: Compilation d'un module noyau
Bonsoir,

Je voudrais compiler un bout de code qui est sensé être un module noyau. Le
problème, c'est que je n'ai qu'un patch pour que les sources du noyau, et
je cherche à compiler ce module sans devoir tout installer (j'ai les
headers).

Pour faire simple, j'essaye en plus de faire ça à la mode debian ; là, ça
ne marche pas trop mal. Je suis parti d'un truc existant, et je l'ai
modifié. Mais ce qui merdouille, c'est la compilation du code lui-même. Il
doit me manquer des paramètres pour la ligne de compilation.

Quelqu'un pourait-il me dire ce qu'il faut mettre ? J'ai attaché le code à
compiler, et le Makefile. Si quelqu'un peut y jetter un oeil... Merci
d'avance.

PS : voici aussi l'erreur que j'obtiens :

make[2]: entrant dans le répertoire « /usr/src/modules/delkin »
/usr/bin/gcc-3.3
for templ in ; do \
    cp $templ `echo $templ | sed -e 's/_KVERS_/2.6.10/g'` ; \
  done
for templ in `ls debian/*.modules.in` ; do \
    test -e ${templ%.modules.in}.backup || cp ${templ%.modules.in} 
${templ%.modules.in}.backup 2>/dev/null || true; \
    sed -e 's/##KVERS##/2.6.10/g ;s/#KVERS#/2.6.10/g ; s/_KVERS_/2.6.10/g ; 
s/##KDREV##/2.6.10-10.00.Custom/g ; s/#KDREV#/2.6.10-10.00.Custom/g ; 
s/_KDREV_/2.6.10-10.00.Custom/g' < $templ > ${templ%.modules.in}; \
  done
dh_clean
/usr/bin/make clean
make[3]: entrant dans le répertoire « /usr/src/modules/delkin »
rm -rf delkin_cb.ko delkin_cb.o .*.ko.cmd .*.o.cmd *~ .tmp_versions
make[3]: quittant le répertoire « /usr/src/modules/delkin »
make[2]: Rien à faire pour « kdist_config ».
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs lib/modules/2.6.10/misc
# build and install the module
/usr/bin/make KPKG_EXTRAV_ARG= KSRC=/usr/src/linux \
        KVER=2.6.10 \
        INST_DIR=debian/delkin-modules-2.6.10/lib/modules/2.6.10/misc/ \
        install
make[3]: entrant dans le répertoire « /usr/src/modules/delkin »
gcc-3.3  -DDRIVER_VERSION=\"0.9\"   -c -o delkin_cb.o delkin_cb.c
In file included from /usr/include/linux/sched.h:12,
                 from /usr/include/linux/module.h:10,
                 from delkin_cb.c:23:
/usr/include/linux/jiffies.h:84: error: erreur de syntaxe before 
"jiffies_64"
/usr/include/linux/jiffies.h:88: error: erreur de syntaxe before 
"get_jiffies_64"
/usr/include/linux/jiffies.h: Dans la fonction « timespec_to_jiffies »:
/usr/include/linux/jiffies.h:320: error: called object is not a function
/usr/include/linux/jiffies.h:320: error: called object is not a function
/usr/include/linux/jiffies.h:320: error: `NSEC_PER_SEC' undeclared (first 
use in this function)
/usr/include/linux/jiffies.h:320: error: (Each undeclared identifier is 
reported only once
/usr/include/linux/jiffies.h:320: error: for each function it appears in.)
...


--
Frédéric

http://www.gbiloba.org
/*
* linux/drivers/ide/pci/delkin_cb.c
*
* Created 20 Oct 2004 by Mark Lord
*
* Basic support for Delkin/ASKA/Workbit Cardbus CompactFlash adapter
*
* Modeled after the 16-bit PCMCIA driver: ide-cs.c
*
* This is slightly peculiar, in that it is a PCI driver,
* but is NOT an IDE PCI driver -- the IDE layer does not directly
* support hot insertion/removal of PCI interfaces, so this driver
* is unable to use the IDE PCI interfaces. Instead, it uses the
* same interfaces as the ide-cs (PCMCIA) driver uses.
* On the plus side, the driver is also smaller/simpler this way.
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive for
* more details.
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/pci.h>
#include <asm/io.h>

/*
 * No chip documentation has yet been found,
 * so these configuration values were pulled from
 * a running Win98 system using "debug".
 * This gives around 3MByte/second read performance,
 * which is about 2/3 of what the chip is capable of.
 *
 * There is also a 4KByte mmio region on the card,
 * but its purpose has yet to be reverse-engineered.
 */
static const u8 setup[] = {
       0x00, 0x05, 0xbe, 0x01, 0x20, 0x8f, 0x00, 0x00,
       0xa4, 0x1f, 0xb3, 0x1b, 0x00, 0x00, 0x00, 0x80,
       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
       0x00, 0x00, 0x00, 0x00, 0xa4, 0x83, 0x02, 0x13,
};


static int __devinit
delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id)
{
       unsigned long base;
       hw_regs_t hw;
       ide_hwif_t *hwif = NULL;
       ide_drive_t *drive;
       int i, rc;


       rc = pci_enable_device(dev);
       if (rc) {
           printk(KERN_ERR "delkin_cb: pci_enable_device failed (%d)\n", rc);
           return rc;
       }
       rc = pci_request_regions(dev, "delkin_cb");
       if (rc) {
           printk(KERN_ERR "delkin_cb: pci_request_regions failed (%d)\n", rc);
           pci_disable_device(dev);
           return rc;
       }
       base = pci_resource_start(dev, 0);
       outb(0x02, base + 0x1e);        /* set nIEN to block interrupts */
       inb(base + 0x17);           /* read status to clear interrupts */
       for (i = 0; i < sizeof(setup); ++i) {
           if (setup[i])
               outb(setup[i], base + i);
       }
       pci_release_regions(dev);       /* IDE layer handles regions itself */


       memset(&hw, 0, sizeof(hw));
       ide_std_init_ports(&hw, base + 0x10, base + 0x1e);
       hw.irq = dev->irq;
       hw.chipset = ide_pci;           /* this enables IRQ sharing */


       rc = ide_register_hw_with_fixup(&hw, &hwif, ide_undecoded_slave);
       if (rc < 0) {
           printk(KERN_ERR "delkin_cb: ide_register_hw failed (%d)\n", rc);
           pci_disable_device(dev);
           return -ENODEV;
       }
       pci_set_drvdata(dev, hwif);
       hwif->pci_dev = dev;
       drive = &hwif->drives[0];
       if (drive->present) {
           drive->io_32bit = 1;
           drive->unmask   = 1;
       }
       return 0;
}


static void
delkin_cb_remove (struct pci_dev *dev)
{
       ide_hwif_t *hwif = pci_get_drvdata(dev);


       if (hwif)
           ide_unregister(hwif->index);
    pci_disable_device(dev);
}


static struct pci_device_id delkin_cb_pci_tbl[] __devinitdata = {
    { PCI_VENDOR_ID_WORKBIT, PCI_DEVICE_ID_WORKBIT_CB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    { 0, },
};
MODULE_DEVICE_TABLE(pci, delkin_cb_pci_tbl);


static struct pci_driver driver = {
    .name        = "Delkin-ASKA-Workbit Cardbus IDE",
    .id_table    = delkin_cb_pci_tbl,
    .probe        = delkin_cb_probe,
    .remove        = delkin_cb_remove,
};


static int
delkin_cb_init (void)
{
    return pci_module_init(&driver);
}


static void
delkin_cb_exit (void)
{
    pci_unregister_driver(&driver);
}


module_init(delkin_cb_init);
module_exit(delkin_cb_exit);

MODULE_AUTHOR("Mark Lord");
MODULE_DESCRIPTION("Basic support for Delkin/ASKA/Workbit Cardbus IDE");
MODULE_LICENSE("GPL");
-include version

DISTFILES=delkin_cb.c

KVERS ?= $(shell uname -r)
KSRC ?= /lib/modules/$(KVERS)/build

KPSUB := $(shell echo $(KVERS) | sed -e 's/\([^\.]*\)\.\([^\.]*\)\..*/\1\2/')

DESTDIR =
INST_DIR := $(DESTDIR)/lib/modules/$(KVERS)/misc

SRC_DIR=$(shell pwd)

-include $(KSRC)/.config

CFLAGS += $(shell [ -f $(KSRC)/include/linux/modversions.h ] && \
          echo -DEXPORT_SYMTAB -DMODVERSIONS \
          -include $(KSRC)/include/linux/modversions.h)


# to produce debug trace, add option "DEBUG=<n>" where <n> is 1 to 6
ifdef DEBUG
CFLAGS += -DDEBUG=$(DEBUG) -g -DDEBUG_TIMER
endif

# to debug timers, add option "TIMER_DEBUG=1 DEBUG=<n>"
ifdef TIMER_DEBUG
CFLAGS += -DTIMER_DEBUG
endif

# to debug event layer, add option "EVENT_DEBUG=1 DEBUG=<n>"
ifdef EVENT_DEBUG
CFLAGS += -DEVENT_DEBUG
endif

# to debug USB layer, add option "USB_DEBUG=1 DEBUG=<n>"
ifdef USB_DEBUG
CFLAGS += -DUSB_DEBUG
endif

# to debug I/O layer, add option "USB_DEBUG=1 DEBUG=<n>"
ifdef IO_DEBUG
CFLAGS += -DIO_DEBUG
endif

CFLAGS += -DDRIVER_VERSION=\"${DRIVER_VERSION}\"

.PHONY: prereq_check clean dist_clean install

all : prereq_check default

OBJS := delkin_cb.o

delkin_cb.o: delkin_cb.c

prereq_check:
    @ if [ ! -f $(KSRC)/include/linux/version.h ]; then \
        echo "Can't find kernel sources in $(KSRC);"; \
        echo "  give the path to kernel sources with KSRC=<path>\
               argument to make";\
        exit 1;\
      fi


clean:
    rm -rf $(MODULE) $(OBJS) .*.ko.cmd .*.o.cmd *~ .tmp_versions


distclean: clean
    rm -f .\#*


MODULE := delkin_cb.ko
obj-m := delkin_cb.o

delkin_cb-objs := $(OBJS)

default: delkin_cb.o
    $(MAKE) -C $(KSRC) SUBDIRS=$(SRC_DIR) \
        DRIVER_VERSION=$(DRIVER_VERSION)


install: default
    mkdir -p $(INST_DIR)
    install -m 0644 $(MODULE) $(INST_DIR)
    #/sbin/depmod -a


dist:
    @for file in $(DISTFILES); do \
      cp  $$file $(distdir)/$$file; \
    done