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

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

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

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

 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 

  • как я могу запускать старые программы из MIPS?
  • Поддерживает ли какая-либо ОС ZFS на MIPS?
  • Как загружать Linux с помощью rootfs в ОЗУ?
  • Как загрузить initrd в память для передачи ядра при использовании kexec?
  • bnx2: Не удается загрузить файл прошивки «bnx2 / bnx2-mips-09-6.2.1b.fw»
  • Декомпилировать / запустить исполняемый файл MIPS под x86_64 Ubuntu
  • GCC (toolchain) для Ralink SoC - ELF не найден и синтаксическая ошибка
  • Debian на платформе Virtual Mips Malta
  • 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>; }; }; 

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

    Interesting Posts

    Как zip рекурсивно все подкаталоги, содержащие только текстовые файлы

    Как преднамеренно фрагментировать файл

    Получение слов перед определенными символами без использования Perl

    Запустить скрипт при выключении

    Установка linux для отключения USB

    Как избежать конфликтов между dnsmasq и systemd-разрешенными?

    Предварительная загрузка gnome-shell перед тем, как получить диалог входа в систему из gdm, возможно ли это?

    Переключиться между Gnome и Cinnamon на CentOS 7?

    Простой тест с плавающей точкой, который может быть скомпилирован из источника?

    длинный формат команды ps в Solaris

    Замените все символы новой строки на пространство, за исключением последнего

    поврежденные зависимости при установке Codelite 8 на linux mint

    Использование rename для удаления '.orig' из файла и добавления '_1' в basename

    fstrim, похоже, не обрезает раздел, который использует lvm и dm-crypt

    Как найти причину эксплойта ssh-scan?

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