我正在使用带有 Debian 构建的嵌入式 Arm。如何从设备树中列出已编译的设备?我想看看是否已经支持某个设备。
对于阅读本文的人来说,“设备树”是将设备添加到(嵌入式)Linux 内核的规范/标准。
我想弄清楚为什么以下设备未在我的Creator CI20上设置为其驱动程序。作为参考,我使用的是 Linux 内核 v4.13.0 并在本地进行编译:
make ARCH=mips ci20_defconfig
make -j8 ARCH=mips CROSS_COMPILE=mipsel-linux-gnu- uImage
Run Code Online (Sandbox Code Playgroud)
从正在运行的系统中,我可以看到:
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
Run Code Online (Sandbox Code Playgroud)
所以设备在运行时被内核看到,现在缺少的部分是为什么驱动程序从未绑定?我会期待这样的事情:
/sys/bus/platform/drivers/jz4780-rng/100000d8.rng
Run Code Online (Sandbox Code Playgroud)
我确实找到了其他一些解释如何调试正在运行的系统的帖子,例如:
虽然这些帖子上的信息是准确的,但对我来说并不是很有帮助。由于我在本地构建我的内核(我printk在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";
};
Run Code Online (Sandbox Code Playgroud)
兼容字符串声明为:
cgu: jz4780-cgu@10000000 {
compatible = …Run Code Online (Sandbox Code Playgroud) (在 raspberry pi zero w,内核 4.14y 上)似乎无线适配器芯片不是 /dev fs 中的设备,而是 'ifconfig' 知道的东西的名称。我知道这是 Berkley Sockets 的人工制品。
它是硬件,我认为它必须在设备树中提及——以导致加载某些驱动程序,但它不能在 /dev (devfs) 中创建条目。
Sockets 在哪里/如何找到这个不是设备的设备?