LINUX.ORG.RU

Device Tree и out-of-tree модуль

 ,


0

2

Потихоньку разбираюсь с device tree и написанием протокольных драйверов для подсистемы SPI. Отладочная плата — Beaglebone Black. Версия ядра — 4.4.23-ti-r51. Система — официальная сборка Debian Jessie для Beaglebone Black.

Решил начать с малого: написать простейший echo-драйвер (для данного драйвера подразумевается, что на другом конце SPI — Arduino Pro Mini 3.3V).

Написал простейший модуль. В поле .compatible указал следующее:

{ .compatible = "arduino,pro-mini-spi-generic" },

Далее начал писать оверлей для своего устройства. По образу и подобию оверлея для вывода SPI в юзерспейс написал свой оверлей:

/dts-v1/;
/plugin/;

/ {
    compatible = "ti,beaglebone", "ti,beaglebone-black";

    /* identification */
    part-number = "BB-ARDUINO-ECHO";
    version = "00A0";

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            spi0_pins_s0: spi0_pins_s0 {
                        pinctrl-single,pins = <
                                0x150 0x30      /* mcasp0_aclkx.spi0_sclk, INPUT_PULLUP  | MODE0 */
                                0x154 0x30      /* mcasp0_fsx.spi0_d0,     INPUT_PULLUP  | MODE0 */
                                0x158 0x10      /* mcasp0_axr0.spi0_d1,    OUTPUT_PULLUP | MODE0 */
                                0x15c 0x10      /* mcasp0_ahclkr.spi0_cs0, OUTPUT_PULLUP | MODE0 */
                >;
            };
        };
    };

    fragment@1 {
        target = <&spi0>;
        __overlay__ {

            #address-cells = <1>;
            #size-cells = <0>;
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <&spi0_pins_s0>;

            ardiuno_echo@0 {
                spi-max-frequency = <200000>;
                reg = <0>;
                compatible = "arduino,pro-mini-spi-generic";
            };
        };
    };
};

Затем решил протестировать оверлей. Оверлей динамически загружается. Затем решил пересобрать initrd, чтобы оверлей подхватывался при загрузке системы. Опции в uEnv.txt указал, оверлей загружается.

Ещё тестировал модуль ядра. Проверил insmod — грузится. Далее решил загружать его modprobe, для чего переместил модуль в /lib/modules/`uname -r`/extra. Затем depmod -a. Всё работает. Динамически тоже грузится, всё происходит хорошо, в dmesg выводит нужную информацию (в функцию probe добавил несколько printk). Далее я столкнулся с проблемой: как заставить out-of-tree модуль ядра автоматически подгружаться при загрузке системы, когда device tree обнаруживает в поле compatible необходимый драйвер? Если это невозможно, то мне бы хотелось узнать, почему. И если невозможно, то есть какой-нибудь гайд по внедрению out-of-tree модуля ядра в дерево исходных кодов?



Последнее исправление: krautcat (всего исправлений: 1)

initramfs

Пересобрал initramfs, написав заранее хук для добавления в образ extra-модулей

#!/bin/sh
# Copy extra kernel modules into the initramfs

if [ "$1" = "prereqs" ]; then exit 0; fi

. /usr/share/initramfs-tools/hook-functions

if [ -d /lib/modules/ ] ; then
    unset check
    check=$(ls /lib/modules/$version/extra | grep ko | head -n 1)
    if [ ! "x${check}" = "x" ] ; then
        mkdir -p $DESTDIR/lib/modules/$version/extra
        cp -a /lib/modules/$version/extra/*.ko $DESTDIR/lib/modules/$version/extra
    fi
fi

В образе модуль точно есть, поверял:

cd /initramfs
rm -rf * && zcat /boot/initrd.img-4.4.23-ti-r51 | cpio -idmv && ls -l lib/modules/`uname -r`/extra

Вывод:

-rw-r--r-- 1 root root 26400 Apr 18  2017 spi-protocol-generic.ko

krautcat
() автор топика
Ответ на: initramfs от krautcat

Да, всё ещё не грузит модуль при загрузке.

krautcat
() автор топика

смотри в сторону /etc/modules.conf или как сделана инициализация модулей в твоём конкретном дистрибутиве.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Я как раз хочу без этого сделать загрузку.

С spidev прокатывает подгрузка нужного модуля, упоминаемого в соответствующем поле в оверлее. Я, собственно, хочу сделать аналогично.

krautcat
() автор топика
Ответ на: комментарий от krautcat

Чтобы ядро при загрузке оверлея смогло подцепить драйвер, модуль с этим драйвером должен быть загружен. Возможно где-то в дебрях depmod и hotplug есть механизм позволяющий получить событие появления устройства в devicetree и загрузить соответствующий модуль, но точно не скажу, я бы делал modprobe при старте.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)

В общем, всё разеришлось.

Обновил образ системы (целиком) по другой причине. Там ядро более свежее (по патч-версии), сделал всё то же самое. Теперь и оверлей грузится нормально, и модуль автоматически подхватывается.

Dark_SavanT, спасибо за помощь!

krautcat
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.