Заредете модула на ядрото преди сондирането на дървото на устройството

Разработих работещ драйвер за моя custom_hardware, който разчита на дървото на устройствата. Тъй като драйверът ми може да се развива, не искам драйверът ми да бъде част от ядрото (когато казвам „да бъде част от ядрото“, имам предвид да бъде компилиран с ядрото по време на създаването на ядрото)

Ето един поглед на моя dts:

custom_hardware: custom_hardware@0x41006000 {
    compatible = "mfg,custom";
    reg = <0x41006000 0x1000>;
    #interrupt-cells = <0x1>;
    interrupt-controller;
};

existing_hardware: existing_hardward@41004000 {
    compatible = "mfg,existing";
    reg = <0x41004000 0x1000>;
    interrupt-parent = <&custom_hardware>;
    interrupts = <0>;
};

Драйверът на existing_hardware вече е компилиран с ядрото (драйверът на existing_hardware е компилиран с ядрото по време на създаването на ядрото).

Това, което бих искал да направя, е да добавя драйвера на моя custom_hardware към ramfs и да оставя на ядрото да зареди драйвера на custom_hardware преди existing_hardware.

Това е важно, тъй като драйверът на existing_hardware изисква virq от irq_domain на драйвера на custom_hardware. За да получите irq_domain, първо трябва да се зареди драйверът на custom_hardware.

Обърнете внимание, че драйверът на existing_hardware се зарежда по време на сондирането на дървото на устройствата, което изглежда се случва в ранния етап на последователността на зареждане на ядрото.


person Z0RrO    schedule 24.03.2014    source източник
comment
Явно завишаваш изискванията. Не искам драйверът ми да бъде част от ядрото. Заредете модула на ядрото преди (към) сонда на дървото на устройството. Изглежда, че единственото важно изискване е драйверът custom_hardware трябва да бъде инсталиран преди драйвера existing_hardware, което може да се осъществи в рамките на съществуващата рамка. Вижте това Въпроси и отговори   -  person sawdust    schedule 24.03.2014


Отговори (2)


Това не е начинът да се направи. Редът на зареждане на модул/драйвер не трябва да има значение. Това, което трябва да направите, е да върнете -EPROBE_DEFER, когато получаването на IRQ се провали в съществуващ_хардуер. След това ще бъде изследван отново по-късно, надяваме се, след като custom_hardware бъде изследван.

Освен това можете да приложите тази корекция, която ще гарантира, че request_irq() се проваля, защото домейнът все още не е налице и връща -EPROBE_DEFER в този случай https://lkml.org/lkml/2014/2/13/114

person Alexandre Belloni    schedule 25.03.2014

Имах подобен проблем (редът на сондиране беше грешен) и единственото просто решение, което намерих, е да поставя модулите в желания ред на сондиране в Makefile. Намерих решението тук: Какъв е редът за зареждане на вградените драйвери в Linux?

person Ray    schedule 12.11.2014