【问题标题】:Linux Device Tree: How to make the device file?Linux设备树:如何制作设备文件?
【发布时间】:2017-04-21 02:44:21
【问题描述】:

在我的 ARM 系统(基于 Tegra)上,我正在运行主线 linux 内核。它使用设备树系统。

我在 .dts 文件中启用了通用内存总线(SoC 的一部分)的硬件驱动程序,方法是设置其 status="okay"。重新编译 dtb 并启动内核。但是没有设备 (/dev/xx) 出现。

驱动编译进内核,可以看到

cat /lib/modules/$(uname -r)/modules.builtin

命令

cat /sys/firmware/devicetree/base/<path to device>/status

返回“好的”。

我需要做一些“mknod”吗? 还有什么是必要的?

【问题讨论】:

  • 适当的驱动程序是内置在内核中,还是作为模块构建并加载?我假设您实际上已经在机器上安装了更新的 DTB - 您可以检查 /sys/firmware/devicetree/base//status 进行确认。
  • 是的,我可以在此路径下看到我的设备的条目及其所有属性
  • 驱动编译进内核(无模块)
  • 好的,找到问题了。设备树条目不正确(消息 =“无子节点”)。需要深挖
  • “无子节点”错误已修复,但仍然没有 /dev-entry :-(

标签: arm linux-device-driver device-tree


【解决方案1】:

传统的 UNIX“字节流”设备模型是大多数现代硬件的高级抽象,因此有很多驱动程序不会为它们控制的设备创建 /dev 条目,这主要是因为它们没有t 适合该模型。尤其是总线驱动程序就是这样的一个例子——它们存在,但只是为了发现和允许访问它们后面的设备;没有 /dev/sata 可以让您与实际的主机控制器交互,无论连接与否,都可以在任何旧端口上发送原始命令;没有 /dev/usb 可以让您尝试任意传输到可能存在或不存在的任意端点。

此外,在这种情况下,您的典型“外部接口”控制器比 SATA 或 USB 等接口简单几个数量级——“设备”本身通常只是一个控制一些时钟和芯片的寄存器块——选择多路复用器。即使驱动程序确实创建了您可以直接与之交互的东西,您也无法很多事情。

在这种情况下,正确的做法是将 DT 中的 FPGA 设备描述为 GMI 总线的子设备,准确地反映硬件,并为此开发自己的驱动程序。公共汽车司机本身只是透明地坐在中间。而且,如果您确实想要一种快速而肮脏的方法,只需直接读取和写入总线地址,那么它就位于内存映射 I/O 区域的后面;这正是 /dev/mem 存在的目的。

【讨论】:

  • 如果通过 PCIe 连接 FPGA,则根本不需要以上所有内容,并且可以在 DT/ACPI/etc 不可知系统中工作。
  • @Andy 是的,这也说明了我的主要观点 - 你不要去 /dev/ 寻找根复合体来试图说服它戳原始总线地址,你写一个驱动程序匹配您的 VID:DID,公交车就可以正常工作:)
猜你喜欢
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多