Инструкция предназначена для сборки и установки драйвера (модуля ядра), процессорных 
модулей (на базе СнК nm6408: mc127.05, nm-card, nm-mezzo, nm-quad, NeuroMezzanine), 
на дистрибутивы OC на базе ядра linux. Платы подключается к Host-PC через шину PCIe. 
Host-PC видет плату, как конечное устройство (EndPoint), которое работает в ведомом 
режиме (slave).

1. Для сборки и инсталляции модулей требуется установить пакет kernel-devel 
(для CentOS) или linux-headers-generic (для Ubuntu или Debian). Этот пакет предоставляет 
заголовочные файлы ядра и make-файлы достаточные для сборки модулей, соответствующих 
версии ядра:
       > yum install kernel-devel
Или:
       > apt install linux-headers-generic
Или:
       > apt install linux-headers-`uname -r`


Для получения более полной информации смотри:
       https://wiki.centos.org/HowTos/I_need_the_Kernel_Source

Для сборки .rpm-пакета драйвера в формате DKMS необходим пакет rpm-build:
       > sudo yum install rpm-build

А в системах на основе Debian - rpm пакет:
       > sudo apt install rpm

Для сборки .deb-пакета драйвера необходимы пакеты fakeroot dpkg-dev debhelper:
       > sudo apt install fakeroot dpkg-dev debhelper

2. Для упрощения процесса сборки и установки драйвера пользователем, 
предоставлен файл сценария сборки - Makefile.

Для получения более полной информации смотри:
       https://www.kernel.org/doc/Documentation/kbuild/modules.txt
       https://wiki.centos.org/HowTos/BuildingKernelModules

Для сборки драйвера необходимо из текущего(*) каталога перейти в директорию NAME(**) 
и выполнить:
       > make modules

В результате успешного построения модуля в каталоге NAME должен 
появиться файл "NAME.ko".

Для очистки каталога NAME надо выполнить:
       > make clean

Для установки драйвера необходимо из каталога NAME выполнить (с правами 
суперпользователя):
       > make install

В результате успешной установки драйвера код возврата (echo $?), следующей 
команды, равен '0':
       > lsmod | grep -i NAME

Для деинсталляции надо выполнить (с правами суперпользователя):
       > make uninstall

Процедуру установки драйвера нужно выполнить один раз. В дальнейшем драйвер будет 
подключаться автоматически при обнаружении платы во время энумерации шины PCIe.

В случае, когда плата подключена к Host-PC и настроен режим начальной загрузки с 
SPI-Flash, а также в SPI-Flash память запрограммирован бинарный образ прошивки 
платы, то должен появиться символьный файл устройства "/dev/NODE_X"(***), где X 
может принимать значения от 0 до 31 включительно.

// TODO: udev rules

3. Загрузить модуль в систему(****) можно без его установки, которая описана в пункте 2. 
В этом случае, загрузку модуля надо выполнять после каждого перезапуска системы.

Для загрузки модуля надо из каталога NAME выполнить (с правами суперпользователя):
       > ./upload_NAME.sh load

Для выгрузки модуля надо из каталога NAME выполнить (с правами суперпользователя):
       > ./upload_NAME.sh unload

После системного сброса СнК nm6408, надо выполнить повторную энумерацию шины PCIe. 
Для этого надо выполнить (с правами суперпользователя):
       > ${PATH_TO_FILE}/upload_NAME.sh reload ${PCIE_DEVICE_NUMBER} ${PCIE_BRIDGE_NUMBER}

Номер устройства и моста можно узнать, выполнив команды:
       > lspci -D -d 0x17CD:
       > lspci -tv

Формат номера узла - "domain:bus:slot.func".

4. Вместо ручной сборки и установки, описанной выше, можно использовать автоматическую
сборку и установку с помощью фрэймворка DKMS. После каждого обновления ядра, DKMS 
будет автоматически пересобирать драйвер и устанавливать его.

В дополнение к заголовочным файлам ядра должен быть установлен соответствующий пакет:
       > yum install kernel-devel dkms
Или:
       > apt install linux-headers-generic dkms
       
Для устнановки dkms-версии драйвера из текущего(*) каталога надо выполнить 
(с правами суперпользователя):
       > ./dkms.sh install
       
Для удаления драйвера из DKMS, из текущего(*) каталога надо выполнить 
(с правами суперпользователя):
       > ./dkms.sh remove

Можно собрать deb- или rpm-пакет для удобства распространения или установки 
в DKMS с помощью пакетного менеджера. Сборка пакета производится без сборки и 
установки самого драйвера (соответственно для deb и rpm):
       > ./dkms.sh mkdeb
       > ./dkms.sh mkrpm
      
По-умолчанию, команды, описанные в п.4, выполняются для всех поддерживаемых плат.
Чтобы установить драйвет только конкретной платы, нужно указать её название. Например,
для NM Card:
       > ./dkms.sh install nm_card

Для удаления драйвера конкретной платы, нужно указать её название. Например, для 
NM Quad:
       > ./dkms.sh remove nm_quad

Аналогично, для удаления или сборки .deb или .rpm пакетов:
       > ./dkms.sh remove mc12705
       > ./dkms.sh mkdeb nm_card
       > ./dkms.sh mkrpm nm_mezzo

5. // TODO: driver interface


(*)    текущий каталог - каталог, в котором располагается этот "ReadMe" файл;
(**)   NAME - имя, соответствующие названию платы (mc12705, nm_card, nm_mezzo, nm_quad, 
                NeuroMezzanine);
(***)  NODE_x - имя узала в файловой системе, например MC12705_00, NM-Card_00, 
                NM-Mezzo_00, NM-Quad_00, NeuroMezzanine_00;
(****) система - Host-PC c установленным дистрибутивом OC на базе ядра linux.

