Коллеги, я запутался.
Есть железка, под которую нами портирован OpenWrt. В железке на кристалле есть периферия (NPU, но это неважно), которая инициализируется и работает.
Мы решили портировать на нашу железку Armbian. Взяли ровно то же ядро с теми же патчами, DTB и конфигом. Собрали. Всё работает, NPU - нет.
Отладка показала, что module_drv_init()
загружается и отрабатывает. Отрабатывает platform_driver_register()
, но коллбек platform_probe()
уже не вызывается и нода в /dev
не создаётся. При этом, of_match_table
содержит корректную и существующую в DTB строку .compatible
. Далее, DT-нода со статусом «окей» видна в /sys/firmware
, сам драйвер вполне себе виден в /sys/bus/platform
и много ещё где. Если что, драйвер вкомпилен в ядро (не модуль)
Отличия между OpenWrt и Armbian:
- Armbian использует systemd, OpenWRT - свою систему инициализации. Хотя, имхо, это не должно ролять, так как драйвер подгружается ещё до всякого юзерспейса
- Пришлось поправить конфиг, добавив поддержку initrd и gzip - у нас он не используется, но Armbian без этого не собирается. Ещё для systemd был добавлен
CONFIG_INOTIFY_USER
. Это потянуло за собой некоторое количество изменений, но на первый взгляд они нерелевантны (дифф могу скинуть) - Отличаются версии gcc: Armbian использует
arm-linux-gnueabihf-gcc
версии 11.4.0, Openwrt -arm-openwrt-linux-muslgnueabi-gcc
версии 12.3.0
Проблема кажется очень тупой и очевидной, но я что-то пропустил. Есть идеи, что?