Как отладить драйвер, не связанный с устройством в Linux?

Я пытаюсь понять, почему следующее устройство не настроено на его драйвер на моем Creator CI20 . Для справки Я использую ядро ​​Linux v4.13.0 и выполняю компиляцию локально:

make ARCH=mips ci20_defconfig make -j8 ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- uImage 

Из запущенной системы я вижу:

  • Как отключить беспроводной адаптер диапазона 2,4 ГГц
  • Как читать из / proc / $ pid / mem в Linux?
  • проверьте, запущен ли java-процесс и повторно запущен, если он не запущен
  • Почему «xdg-mime query filetype ...» не может найти новый добавленный тип файла?
  • Найти, на какие файлы влияют плохие блоки на файловой системе ext4
  • Используйте два сетевых адаптера для разных подсетей
  •  ci20@ci20:~# find /sys | grep rng /sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8 /sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/compatible /sys/firmware/devicetree/base/jz4780-cgu@10000000/rng@d8/name /sys/bus/platform/drivers/jz4780-rng /sys/bus/platform/drivers/jz4780-rng/bind /sys/bus/platform/drivers/jz4780-rng/unbind /sys/bus/platform/drivers/jz4780-rng/uevent 

    Таким образом, устройство просматривается ядром во время выполнения, теперь недостающая часть – это почему драйвер никогда не привязан? Я бы ожидал чего-то вроде этого:

     /sys/bus/platform/drivers/jz4780-rng/100000d8.rng 

    Я нашел несколько других сообщений, объясняющих, как отлаживать запущенную систему, такую ​​как:

    • https://stackoverflow.com/questions/28406776/driver-binding-using-device-tree-without-compatible-string-in-the-driver
    • https://stackoverflow.com/questions/35580862/device-tree-mismatch-probe-never-called
    • https://stackoverflow.com/questions/41446737/platform-device-driver-autoloading-mechanism
    • Возможно ли получить информацию для дерева устройств с помощью / sys работающего ядра?

    Хотя информация на этих постах точна, это не очень полезно для меня. Поскольку я printk локально мое ядро ​​(я добавил printk в функцию jz4780-rng драйвера jz4780-rng ), мой вопрос:

    • какой вариант включить во время компиляции, чтобы ядро ​​распечатало точную информацию о том, что он не вызвал функцию зондирования для jz4780-rng ?
    • В частности, как распечатать полный список проверенных шин / драйверов для driver_probe_device ?

    Я в порядке, чтобы добавить printk любом месте кода, чтобы отладить это. Вопрос скорее: какая функция проходит через дерево устройства и вызывает функцию probe / init?

    Для справки:

     $ dtc -I fs -O dts /sys/firmware/devicetree/base | grep -A 1 rng rng@d8 { compatible = "ingenic,jz4780-rng"; }; 

    совместимая строка объявляется как:

     cgu: jz4780-cgu@10000000 { compatible = "ingenic,jz4780-cgu", "syscon"; reg = <0x10000000 0x100>; clocks = <&ext>, <&rtc>; clock-names = "ext", "rtc"; #clock-cells = <1>; rng: rng@d8 { compatible = "ingenic,jz4780-rng"; }; }; 

    А в драйвере как:

     static const struct of_device_id jz4780_rng_dt_match[] = { { .compatible = "ingenic,jz4780-rng", }, { }, }; MODULE_DEVICE_TABLE(of, jz4780_rng_dt_match); static struct platform_driver jz4780_rng_driver = { .driver = { .name = "jz4780-rng", .of_match_table = jz4780_rng_dt_match, }, .probe = jz4780_rng_probe, .remove = jz4780_rng_remove, }; module_platform_driver(jz4780_rng_driver); 

    Update1:

    Когда я создаю свое ядро ​​с CONFIG_DEBUG_DRIVER=y , вот что я вижу:

     # grep driver_probe_device syslog Sep 6 10:08:07 ci20 kernel: [ 0.098280] bus: 'platform': driver_probe_device: matched device 10031000.serial with driver ingenic-uart Sep 6 10:08:07 ci20 kernel: [ 0.098742] bus: 'platform': driver_probe_device: matched device 10033000.serial with driver ingenic-uart Sep 6 10:08:07 ci20 kernel: [ 0.099209] bus: 'platform': driver_probe_device: matched device 10034000.serial with driver ingenic-uart Sep 6 10:08:07 ci20 kernel: [ 0.106945] bus: 'platform': driver_probe_device: matched device 1b000000.nand-controller with driver jz4780-nand Sep 6 10:08:07 ci20 kernel: [ 0.107282] bus: 'platform': driver_probe_device: matched device 134d0000.bch with driver jz4780-bch Sep 6 10:08:07 ci20 kernel: [ 0.107470] bus: 'platform': driver_probe_device: matched device 16000000.dm9000 with driver dm9000 Sep 6 10:08:07 ci20 kernel: [ 0.165618] bus: 'platform': driver_probe_device: matched device 10003000.rtc with driver jz4740-rtc Sep 6 10:08:07 ci20 kernel: [ 0.166177] bus: 'platform': driver_probe_device: matched device 10002000.jz4780-watchdog with driver jz4740-wdt Sep 6 10:08:07 ci20 kernel: [ 0.170930] bus: 'platform': driver_probe_device: matched device 1b000000.nand-controller with driver jz4780-nand 

    Но только:

     # grep rng syslog Sep 6 10:08:07 ci20 kernel: [ 0.166842] bus: 'platform': add driver jz4780-rng Sep 6 10:08:42 ci20 kernel: [ 54.584451] random: crng init done 

    В качестве дополнительной заметки узел cgu : cgu здесь не упоминается, но есть jz4780-cgu .


    Update2:

    Если я переместю rng узла rng за cgu узла cgu , я, по крайней мере,

     # grep rng /var/log/syslog Sep 6 10:30:57 ci20 kernel: [ 0.167017] bus: 'platform': add driver jz4780-rng Sep 6 10:30:57 ci20 kernel: [ 0.167033] bus: 'platform': driver_probe_device: matched device 10000000.rng with driver jz4780-rng Sep 6 10:30:57 ci20 kernel: [ 0.167038] bus: 'platform': really_probe: probing driver jz4780-rng with device 10000000.rng Sep 6 10:30:57 ci20 kernel: [ 0.167050] jz4780-rng 10000000.rng: no pinctrl handle Sep 6 10:30:57 ci20 kernel: [ 0.167066] devices_kset: Moving 10000000.rng to end of list Sep 6 10:30:57 ci20 kernel: [ 0.172774] jz4780-rng: probe of 10000000.rng failed with error -22 Sep 6 10:31:32 ci20 kernel: [ 54.802794] random: crng init done 

    С помощью:

      rng: rng@100000d8 { compatible = "ingenic,jz4780-rng"; }; 

    Я также могу проверить:

     # find /sys/ | grep rng /sys/devices/platform/10000000.rng /sys/devices/platform/10000000.rng/subsystem /sys/devices/platform/10000000.rng/driver_override /sys/devices/platform/10000000.rng/modalias /sys/devices/platform/10000000.rng/uevent /sys/devices/platform/10000000.rng/of_node /sys/firmware/devicetree/base/rng@100000d8 /sys/firmware/devicetree/base/rng@100000d8/compatible /sys/firmware/devicetree/base/rng@100000d8/status /sys/firmware/devicetree/base/rng@100000d8/reg /sys/firmware/devicetree/base/rng@100000d8/name /sys/bus/platform/devices/10000000.rng /sys/bus/platform/drivers/jz4780-rng /sys/bus/platform/drivers/jz4780-rng/bind /sys/bus/platform/drivers/jz4780-rng/unbind /sys/bus/platform/drivers/jz4780-rng/uevent 

  • Где работает сценарий оболочки?
  • Как определить, какие возможности необходимы для команды?
  • Как я могу узнать, что случилось с моей коробкой Debian?
  • Могу ли я использовать образ диска для файловой системы с правами чтения и записи в качестве верхнего уровня OverlayFS?
  • Изнашивание уровня SD-карты из-за файла подкачки во встроенном Linux
  • Чередование долговременной задачи для приостановки / запуска для уменьшения процессора
  • One Solution collect form web for “Как отладить драйвер, не связанный с устройством в Linux?”

    Рабочее решение для подключения драйвера к устройству:

     cgublock: jz4780-cgublock@10000000 { compatible = "simple-bus", "syscon"; #address-cells = <1>; #size-cells = <1>; reg = <0x10000000 0x100>; ranges; cgu: jz4780-cgu@10000000 { compatible = "ingenic,jz4780-cgu"; reg = <0x10000000 0x100>; clocks = <&ext>, <&rtc>; clock-names = "ext", "rtc"; #clock-cells = <1>; }; rng: rng@d8 { compatible = "ingenic,jz4780-rng"; reg = <0x100000d8 0x8>; }; }; 

    Это было обнаружено, глядя на другие примеры. Я бы предпочел решение, где я получаю правильный диагноз, почему предыдущая попытка неверна.

    Linux и Unix - лучшая ОС в мире.