В общем кому интересно, то подправленный код тут - https://github.com/ze0n4ri0t/dm642_pci_e, у меня он собирается в модуль dm642_pci.ko
$ uname -a
Linux zen 4.4.0-57-generic #78-Ubuntu SMP Fri Dec 9 23:50:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Ядро с debug поставлено
Вывод:
$ make
make -C /lib/modules/4.4.0-57-generic/build M=/home/sli/git/dm642_pci_e modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-57-generic'
CC [M] /home/sli/git/dm642_pci_e/pci.o
/home/sli/git/dm642_pci_e/pci.c: In function ‘probe’:
/home/sli/git/dm642_pci_e/pci.c:215:40: warning: passing argument 2 of ‘request_irq’ from incompatible pointer type [-Wincompatible-pointer-types]
ret = request_irq (dev->pci_dev->irq, dm642_interrupt, IRQF_SHARED, "dm642_pci", dev);
^
In file included from /home/sli/git/dm642_pci_e/pci.c:6:0:
include/linux/interrupt.h:134:1: note: expected ‘irq_handler_t {aka enum irqreturn (*)(int, void *)}’ but argument is of type ‘irqreturn_t (*)(int, void *, struct pt_regs *) {aka enum irqreturn (*)(int, void *, struct pt_regs *)}’
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
^
CC [M] /home/sli/git/dm642_pci_e/mem.o
/home/sli/git/dm642_pci_e/mem.c:250:21: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
.unlocked_ioctl = dm642_ioctl,
^
/home/sli/git/dm642_pci_e/mem.c:250:21: note: (near initialization for ‘dm642_fops.unlocked_ioctl’)
CC [M] /home/sli/git/dm642_pci_e/proc.o
CC [M] /home/sli/git/dm642_pci_e/task.o
/home/sli/git/dm642_pci_e/task.c: In function ‘task_open’:
/home/sli/git/dm642_pci_e/task.c:318:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
struct iopacket p;
^
/home/sli/git/dm642_pci_e/task.c: In function ‘task_release’:
/home/sli/git/dm642_pci_e/task.c:362:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
struct iopacket p;
^
/home/sli/git/dm642_pci_e/task.c: At top level:
/home/sli/git/dm642_pci_e/task.c:844:20: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
.unlocked_ioctl = task_ioctl,
^
/home/sli/git/dm642_pci_e/task.c:844:20: note: (near initialization for ‘task_fops.unlocked_ioctl’)
CC [M] /home/sli/git/dm642_pci_e/mmap.o
CC [M] /home/sli/git/dm642_pci_e/dm642.o
LD [M] /home/sli/git/dm642_pci_e/dm642_pci.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/sli/git/dm642_pci_e/dm642_pci.mod.o
LD [M] /home/sli/git/dm642_pci_e/dm642_pci.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-57-generic'
Но инициализацию всяких функций я пока не правил, поэтому не рекомендую инсертить модуль если не знаете что делать при kernel panic
Он, у меня грузиться в ядро (что само по себе удивительно
), и даже устройства появляются,
# ./dm642_load
[26403.645475] dm642_pci: module verification failed: signature and/or required key missing - tainting kernel
[26403.649653] alloc_chrdev_region: major = 242 count = 1024
[26403.649671] dm642_pci: pci dev 0000:02:04.0 (id 104c:9065 rev 01) detected.
[26403.649743] dm642_pci: 0000:02:04.0: Base0: dec00000, len: 400000. - Prefetchable memory MAP to: ffffc90004000000
[26403.649746] dm642_pci: 0000:02:04.0: Base1: dd800000, len: 800000. - Non-Prefetchable memory MAP to: ffffc90005000000
[26403.649747] dm642_pci: 0000:02:04.0: Base2: e030, len: 10. - IO
[26403.649748] dm642_pci: irq = 16
[26403.649770] dm642_pci: pci dev 0000:02:05.0 (id 104c:9065 rev 01) detected.
[26403.649812] dm642_pci: 0000:02:05.0: Base0: de800000, len: 400000. - Prefetchable memory MAP to: ffffc90004800000
[26403.649814] dm642_pci: 0000:02:05.0: Base1: dd000000, len: 800000. - Non-Prefetchable memory MAP to: ffffc90006000000
[26403.649815] dm642_pci: 0000:02:05.0: Base2: e020, len: 10. - IO
[26403.649815] dm642_pci: irq = 17
[26403.649829] dm642_pci: pci dev 0000:02:06.0 (id 104c:9065 rev 01) detected.
[26403.649864] dm642_pci: 0000:02:06.0: Base0: de400000, len: 400000. - Prefetchable memory MAP to: ffffc90007000000
[26403.649867] dm642_pci: 0000:02:06.0: Base1: dc800000, len: 800000. - Non-Prefetchable memory MAP to: ffffc90008000000
[26403.649867] dm642_pci: 0000:02:06.0: Base2: e010, len: 10. - IO
[26403.649868] dm642_pci: irq = 18
[26403.649883] dm642_pci: pci dev 0000:02:07.0 (id 104c:9065 rev 01) detected.
[26403.649923] dm642_pci: 0000:02:07.0: Base0: de000000, len: 400000. - Prefetchable memory MAP to: ffffc90007800000
[26403.649925] dm642_pci: 0000:02:07.0: Base1: dc000000, len: 800000. - Non-Prefetchable memory MAP to: ffffc90009000000
[26403.649926] dm642_pci: 0000:02:07.0: Base2: e000, len: 10. - IO
[26403.649926] dm642_pci: irq = 19
# ls -la /dev/dm642_pci*
lrwxrwxrwx 1 root root 10 Dec 31 02:32 /dev/dm642_pci -> dm642_pci0
crw-rw-r-- 1 root staff 242, 0 Dec 31 02:32 /dev/dm642_pci0
crw-rw-r-- 1 root staff 242, 1 Dec 31 02:32 /dev/dm642_pci1
crw-rw-r-- 1 root staff 242, 2 Dec 31 02:32 /dev/dm642_pci2
crw-rw-r-- 1 root staff 242, 3 Dec 31 02:32 /dev/dm642_pci3
crw-r--r-- 1 root root 242, 4 Dec 31 02:32 /dev/dm642_pci4
Но панику 100% при выгрузке модуля, и при попытке (возможно после 1 ой 2 х) прочитать что то с устройства вы получите.
И еще момент, на сколько я понял, это не совсем драйвер, это скорее всего заготовка, к которой можно дописывать функционал.