Потихоньку разбираюсь с 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 модуля ядра в дерево исходных кодов?


