Estoy tratando de averiguar por qué el siguiente dispositivo no está configurado para su controlador en mi Creator CI20 . Como referencia, estoy usando un kernel de Linux v4.13.0 y estoy compilando localmente:
make ARCH=mips ci20_defconfig
make -j8 ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- uImage
Desde el sistema en ejecución puedo ver:
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
Entonces, el dispositivo es visto por el núcleo en tiempo de ejecución, ahora la pieza que falta es ¿por qué el controlador nunca está vinculado? Hubiera esperado algo como esto:
/sys/bus/platform/drivers/jz4780-rng/100000d8.rng
Encontré algunas otras publicaciones que explican cómo depurar un sistema en ejecución, como:
- /programming/28406776/driver-binding-using-device-tree-without-compatible-string-in-the-driver
- /programming/35580862/device-tree-mismatch-probe-never-called
- /programming/41446737/platform-device-driver-autoloading-mechanism
- ¿Es posible obtener la información para un árbol de dispositivos usando / sys de un kernel en ejecución?
Si bien la información es precisa en esas publicaciones, no es muy útil para mí. Como estoy construyendo localmente mi kernel (agregué printk
la función de sonda del jz4780-rng
controlador), mi pregunta es:
- ¿Qué opción debo activar en el momento de la compilación para que el núcleo imprima una información precisa sobre su falla al llamar a la función de sonda para el
jz4780-rng
controlador? - En particular, ¿cómo imprimo la lista completa del bus / controlador probado
driver_probe_device
?
Estoy bien para agregar printk
en cualquier parte del código para depurar esto. La pregunta es más bien: ¿qué función atraviesa el árbol de dispositivos y llama a la función probe / init?
Para referencia:
$ dtc -I fs -O dts /sys/firmware/devicetree/base | grep -A 1 rng
rng@d8 {
compatible = "ingenic,jz4780-rng";
};
la cadena compatible se declara como:
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";
};
};
Y en el conductor como:
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);
Actualización1:
Cuando construyo mi kernel CONFIG_DEBUG_DRIVER=y
, esto es lo que puedo ver:
# 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
Pero sólo:
# 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
Como nota al margen, el rng
nodo de nivel superior: cgu
no se hace referencia aquí, pero hay un jz4780-cgu
controlador.
Actualización2:
Si muevo la rng
declaración de nodo fuera del cgu
nodo de nivel superior , al menos puedo ver que finalmente se produce algún enlace:
# 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
Utilizando:
rng: rng@100000d8 {
compatible = "ingenic,jz4780-rng";
};
También puedo verificar:
# 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