DG-4016HC - 16-ти канальная плата видеозахвата с аппаратным сжатием

Есть такая плата [[http://www.dvr.net.ua/product.php?prodid=61]],
это практически аналог [[http://www.hikvision.com/en/Products_show.asp?id=17]]
на который есть драйвера под линь [[http://www.hikvision.com/en/download_more.asp?id=110]], но они заточены под ядро fedora core 8 2.6.23.
Есть еще вот такой драйвер на соурсефорже [[http://dm642-pci.sourceforge.net/]], но он вообще под 2.6.15-fc5

Вопрос, есть ли возможность их как-то добавить в более свежее ядро, например 3.8.13.

ЗЫ: Это может не к месту, но кто пояснит, в данный момент, когда пишу эти строки просмотрел вывод

eix sources

ванильное ядро стабл 3.8.13 гентушное тоже 3.8.13, кальковское же 3.8.13 помечено как нестабильное?

Бинари драйверов вижу. Исходников нет. А без них врятли кто сможет завести их со свежими ядрами.

Андрей Сеник wrote:

Бинари драйверов вижу. Исходников нет. А без них врятли кто сможет завести их со свежими ядрами.

по ссылке http://dm642-pci.sourceforge.net/ вроде как исходники, может ошибаюсь, но куда их размещать, как собирать

cl-kernel -m

так чтоли, модулем собирать? может быть кто-то более сведущий?

Нет, там же написано как. Пункт 2.
А cl-kernel “надстройка” облегчающая сборку ядра.
Вам она не поможет. У вас “самосборный” модуль.

Да здравствует некропост!
По существу:
Код там есть - http://dm642-pci.cvs.sourceforge.net/dm642-pci/
Частично переписал его под 3.10, на 4+ тоже часть ошибок ушла при сборке.
Но застрял на зависимостях по v4l

:~/svn/code/c/dm642_pci# make
make -C /lib/modules/4.4.0-31-generic/build M=/home/sli/svn/code/c/dm642_pci modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-31-generic'
  CC [M]  /home/sli/svn/code/c/dm642_pci/task.o
In file included from include/linux/videodev.h:13:0,
                 from /home/sli/svn/code/c/dm642_pci/task.c:22:
/usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h:9:26: error: no include path in which to search for stdint.h
/home/sli/svn/code/c/dm642_pci/task.c: In function ‘task_open’:
/home/sli/svn/code/c/dm642_pci/task.c:315:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
   struct iopacket p;
   ^
/home/sli/svn/code/c/dm642_pci/task.c: In function ‘task_release’:
/home/sli/svn/code/c/dm642_pci/task.c:359:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
   struct iopacket p;
   ^
/home/sli/svn/code/c/dm642_pci/task.c: In function ‘task_do_ioctl’:
/home/sli/svn/code/c/dm642_pci/task.c:632:8: error: ‘VIDIOC_REQBUFS’ undeclared (first use in this function)
   case VIDIOC_REQBUFS:
        ^
/home/sli/svn/code/c/dm642_pci/task.c:632:8: note: each undeclared identifier is reported only once for each function it appears in
/home/sli/svn/code/c/dm642_pci/task.c:636:25: error: dereferencing pointer to incomplete type ‘struct v4l2_requestbuffers’
                  if (req->memory != V4L2_MEMORY_MMAP)
                         ^
/home/sli/svn/code/c/dm642_pci/task.c:636:37: error: ‘V4L2_MEMORY_MMAP’ undeclared (first use in this function)
                  if (req->memory != V4L2_MEMORY_MMAP)
                                     ^
/home/sli/svn/code/c/dm642_pci/task.c:638:35: error: ‘V4L2_BUF_TYPE_VIDEO_CAPTURE’ undeclared (first use in this function)
                  if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
                                   ^
/home/sli/svn/code/c/dm642_pci/task.c:639:21: error: ‘V4L2_BUF_TYPE_VIDEO_OUTPUT’ undeclared (first use in this function)
        req->type != V4L2_BUF_TYPE_VIDEO_OUTPUT )
                     ^
/home/sli/svn/code/c/dm642_pci/task.c:644:15: error: ‘VIDIOC_QUERYBUF’ undeclared (first use in this function)
          case VIDIOC_QUERYBUF:
               ^
/home/sli/svn/code/c/dm642_pci/task.c:648:23: error: storage size of ‘type’ isn’t known
    enum v4l2_buf_type type;
                       ^
/home/sli/svn/code/c/dm642_pci/task.c:651:15: error: dereferencing pointer to incomplete type ‘struct v4l2_buffer’
    index = buf->index;
               ^
/home/sli/svn/code/c/dm642_pci/task.c:657:40: error: invalid application of ‘sizeof’ to incomplete type ‘struct v4l2_buffer’
                  memset(buf, 0, sizeof(struct v4l2_buffer));
                                        ^
/home/sli/svn/code/c/dm642_pci/task.c:671:32: error: ‘V4L2_BUF_FLAG_MAPPED’ undeclared (first use in this function)
                   buf->flags = V4L2_BUF_FLAG_MAPPED;
                                ^
/home/sli/svn/code/c/dm642_pci/task.c:673:34: error: ‘V4L2_BUF_FLAG_QUEUED’ undeclared (first use in this function)
                    buf->flags |= V4L2_BUF_FLAG_QUEUED;
                                  ^
/home/sli/svn/code/c/dm642_pci/task.c:676:41: error: ‘V4L2_BUF_FLAG_DONE’ undeclared (first use in this function)
                           buf->flags |= V4L2_BUF_FLAG_DONE;
                                         ^
/home/sli/svn/code/c/dm642_pci/task.c:648:23: warning: unused variable ‘type’ [-Wunused-variable]
    enum v4l2_buf_type type;
                       ^
/home/sli/svn/code/c/dm642_pci/task.c:690:8: error: ‘VIDIOC_QBUF’ undeclared (first use in this function)
   case VIDIOC_QBUF:
        ^
/home/sli/svn/code/c/dm642_pci/task.c:694:23: error: storage size of ‘type’ isn’t known
    enum v4l2_buf_type type;
                       ^
/home/sli/svn/code/c/dm642_pci/task.c:698:15: error: dereferencing pointer to incomplete type ‘struct v4l2_buffer’
    index = buf->index;
               ^
/home/sli/svn/code/c/dm642_pci/task.c:694:23: warning: unused variable ‘type’ [-Wunused-variable]
    enum v4l2_buf_type type;
                       ^
/home/sli/svn/code/c/dm642_pci/task.c:755:8: error: ‘VIDIOC_DQBUF’ undeclared (first use in this function)
   case VIDIOC_DQBUF:
        ^
/home/sli/svn/code/c/dm642_pci/task.c:758:23: error: storage size of ‘type’ isn’t known
    enum v4l2_buf_type type;
                       ^
/home/sli/svn/code/c/dm642_pci/task.c:763:25: error: dereferencing pointer to incomplete type ‘struct v4l2_buffer’
                  if (buf->memory != V4L2_MEMORY_MMAP)
                         ^
/home/sli/svn/code/c/dm642_pci/task.c:758:23: warning: unused variable ‘type’ [-Wunused-variable]
    enum v4l2_buf_type type;
                       ^
/home/sli/svn/code/c/dm642_pci/task.c: At top level:
/home/sli/svn/code/c/dm642_pci/task.c:835:2: error: unknown field ‘ioctl’ specified in initializer
  .ioctl  = task_ioctl,
  ^
/home/sli/svn/code/c/dm642_pci/task.c:835:12: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
  .ioctl  = task_ioctl,
            ^
/home/sli/svn/code/c/dm642_pci/task.c:835:12: note: (near initialization for ‘task_fops.read_iter’)
scripts/Makefile.build:258: recipe for target '/home/sli/svn/code/c/dm642_pci/task.o' failed
make[2]: *** [/home/sli/svn/code/c/dm642_pci/task.o] Error 1
Makefile:1403: recipe for target '_module_/home/sli/svn/code/c/dm642_pci' failed
make[1]: *** [_module_/home/sli/svn/code/c/dm642_pci] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-31-generic'
Makefile:7: recipe for target 'all' failed
make: *** [all] Error 2

Нужен С программист, со знаниями ядер Linux.

Приаттачил исправленные файлы, там закомментировано то что не собиралось, и кое где подписано что и как исправлялось.
В основном, убраны зависимости на include config.h
Включено #include <linux/fs.h>
Ну в общем если сдедлать диф с оригиналными файлами из sourceforge.net то видно будет.
Кое какая инициализация функций подправлена, в любом случае даже если соберется под текущие ядра, нет гарантии что kernel panic моментом не схлопочем, ну или просто работать не будет.

dm642_pci_for_kernel.3.plus.7z (13.4 KB)

Для решения части error прописываем в task.c
#include <linux/videodev2.h> /* error: ‘VIDIOC_REQBUFS’ undeclared (first use in this function) , V4L2_MEMORY_MMAP … other v4l */

Модуль собрался, но загружать его хе хе, пока не советую, там как минимум надо кучу инициализации всего переделать.

sli@zen:~/svn/code/c/dm642_pci$ make
make -C /lib/modules/4.4.0-57-generic/build M=/home/sli/svn/code/c/dm642_pci modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-57-generic'
  CC [M]  /home/sli/svn/code/c/dm642_pci/pci.o
/home/sli/svn/code/c/dm642_pci/pci.c: In function ‘probe’:
/home/sli/svn/code/c/dm642_pci/pci.c:197:12: warning: passing argument 1 of ‘sema_init’ from incompatible pointer type [-Wincompatible-pointer-types]
  sema_init(&dev->hw_access_sem,1);
            ^
In file included from /home/sli/svn/code/c/dm642_pci/pci.c:7:0:
include/linux/semaphore.h:32:20: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 static inline void sema_init(struct semaphore *sem, int val)
                    ^
/home/sli/svn/code/c/dm642_pci/pci.c:198:12: warning: passing argument 1 of ‘sema_init’ from incompatible pointer type [-Wincompatible-pointer-types]
  sema_init(&dev->task_access_sem,1);
            ^
In file included from /home/sli/svn/code/c/dm642_pci/pci.c:7:0:
include/linux/semaphore.h:32:20: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 static inline void sema_init(struct semaphore *sem, int val)
                    ^
/home/sli/svn/code/c/dm642_pci/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/svn/code/c/dm642_pci/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/svn/code/c/dm642_pci/mem.o
/home/sli/svn/code/c/dm642_pci/mem.c: In function ‘dm642_read’:
/home/sli/svn/code/c/dm642_pci/mem.c:68:25: warning: passing argument 1 of ‘down_interruptible’ from incompatible pointer type [-Wincompatible-pointer-types]
  if( down_interruptible(&dev->hw_access_sem) )
                         ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/mem.c:8:
include/linux/semaphore.h:40:25: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern int __must_check down_interruptible(struct semaphore *sem);
                         ^
/home/sli/svn/code/c/dm642_pci/mem.c:83:7: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
    up(&dev->hw_access_sem);
       ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/mem.c:8:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/mem.c:93:5: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
  up(&dev->hw_access_sem);
     ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/mem.c:8:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/mem.c: In function ‘dm642_write’:
/home/sli/svn/code/c/dm642_pci/mem.c:107:25: warning: passing argument 1 of ‘down_interruptible’ from incompatible pointer type [-Wincompatible-pointer-types]
  if( down_interruptible(&dev->hw_access_sem) )
                         ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/mem.c:8:
include/linux/semaphore.h:40:25: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern int __must_check down_interruptible(struct semaphore *sem);
                         ^
/home/sli/svn/code/c/dm642_pci/mem.c:122:7: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
    up(&dev->hw_access_sem);
       ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/mem.c:8:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/mem.c:132:5: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
  up(&dev->hw_access_sem);
     ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/mem.c:8:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/mem.c: At top level:
/home/sli/svn/code/c/dm642_pci/mem.c:250:21: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
  .unlocked_ioctl  = dm642_ioctl,
                     ^
/home/sli/svn/code/c/dm642_pci/mem.c:250:21: note: (near initialization for ‘dm642_fops.unlocked_ioctl’)
  CC [M]  /home/sli/svn/code/c/dm642_pci/proc.o
  CC [M]  /home/sli/svn/code/c/dm642_pci/task.o
/home/sli/svn/code/c/dm642_pci/task.c: In function ‘task_open’:
/home/sli/svn/code/c/dm642_pci/task.c:292:25: warning: passing argument 1 of ‘down_interruptible’ from incompatible pointer type [-Wincompatible-pointer-types]
  if( down_interruptible(&dev->task_access_sem) )
                         ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/task.c:9:
include/linux/semaphore.h:40:25: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern int __must_check down_interruptible(struct semaphore *sem);
                         ^
/home/sli/svn/code/c/dm642_pci/task.c:315:7: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
    up(&dev->task_access_sem);
       ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/task.c:9:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/task.c:318:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
   struct iopacket p;
   ^
/home/sli/svn/code/c/dm642_pci/task.c:340:5: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
  up(&dev->task_access_sem);
     ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/task.c:9:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/task.c: In function ‘task_release’:
/home/sli/svn/code/c/dm642_pci/task.c:350:25: warning: passing argument 1 of ‘down_interruptible’ from incompatible pointer type [-Wincompatible-pointer-types]
  if( down_interruptible(&dev->task_access_sem) )
                         ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/task.c:9:
include/linux/semaphore.h:40:25: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern int __must_check down_interruptible(struct semaphore *sem);
                         ^
/home/sli/svn/code/c/dm642_pci/task.c:362:3: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
   struct iopacket p;
   ^
/home/sli/svn/code/c/dm642_pci/task.c:366:5: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
  up(&dev->task_access_sem);
     ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/task.c:9:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/task.c: At top level:
/home/sli/svn/code/c/dm642_pci/task.c:844:20: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
  .unlocked_ioctl = task_ioctl,
                    ^
/home/sli/svn/code/c/dm642_pci/task.c:844:20: note: (near initialization for ‘task_fops.unlocked_ioctl’)
  CC [M]  /home/sli/svn/code/c/dm642_pci/mmap.o
  CC [M]  /home/sli/svn/code/c/dm642_pci/dm642.o
/home/sli/svn/code/c/dm642_pci/dm642.c: In function ‘request_io’:
/home/sli/svn/code/c/dm642_pci/dm642.c:124:25: warning: passing argument 1 of ‘down_interruptible’ from incompatible pointer type [-Wincompatible-pointer-types]
  if( down_interruptible(&dev->hw_access_sem) )
                         ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/dm642.c:3:
include/linux/semaphore.h:40:25: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern int __must_check down_interruptible(struct semaphore *sem);
                         ^
/home/sli/svn/code/c/dm642_pci/dm642.c:135:8: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
     up(&dev->hw_access_sem);
        ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/dm642.c:3:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
/home/sli/svn/code/c/dm642_pci/dm642.c:153:5: warning: passing argument 1 of ‘up’ from incompatible pointer type [-Wincompatible-pointer-types]
  up(&dev->hw_access_sem);
     ^
In file included from include/linux/fs.h:22:0,
                 from /home/sli/svn/code/c/dm642_pci/dm642.c:3:
include/linux/semaphore.h:44:13: note: expected ‘struct semaphore *’ but argument is of type ‘struct semaphore **’
 extern void up(struct semaphore *sem);
             ^
  LD [M]  /home/sli/svn/code/c/dm642_pci/dm642_pci.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/sli/svn/code/c/dm642_pci/dm642_pci.mod.o
  LD [M]  /home/sli/svn/code/c/dm642_pci/dm642_pci.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-57-generic'

Архив с замученными файлами в прил.
Но я не программист, по крайней мере не на сях :slight_smile: поэтому косяков может быть много.

dm642_pci_e.7z (13.8 KB)

В общем кому интересно, то подправленный код тут - 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
Он, у меня грузиться в ядро (что само по себе удивительно :slight_smile: ), и даже устройства появляются,
# ./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 х) прочитать что то с устройства вы получите.

И еще момент, на сколько я понял, это не совсем драйвер, это скорее всего заготовка, к которой можно дописывать функционал.