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