如何应对平台碎片化,device tree是答案吗?

How to cope with platform fragmentation, is device tree the answer?

我的任务是为以太网和 LED 等实现具有固定名称的自定义层。

在 x86 和 ARM 设备上需要相同。所以 Power LEDeth1 对于应用程序来说总是相同的,但没有连接到相同的硬件引脚。从我的角度来看,我可以在 ARM 上使用设备树分配来完成此操作。但是我可以在基于 x86 的板上使用设备树来做到这一点吗?这是好的做法吗?

背景资料: 目标:广泛的嵌入式 Linux 开发板,构建系统:Buildroot,自定义 Linux 内核版本,无 Linux 发行版,Busybox 运行 在顶部

使用sysfs

例如,您可以通过/sys/class/net/eth0/访问网络接口信息。对于特定的外围设备,您可以提供自己的内核对象,它提供了一个稳定的名称。

这已经将应用程序的 x86 / ARM 差异保持在最低限度。例如,我在考虑 wpa_supplicant 或大多数 init 级别的初始化脚本。

TL;DR - 设备树不是您要找的答案。根据您的最终需求,有多种方法可以做到这一点。


设备树继承自PowerPC。它不是 user-space 的接口。它旨在为给定的 CPU/SOC 系列提供数据驱动的电路板布局定制。例如,有许多TI OMAP devices见表中的设备,每个设备都有不同的芯片连接到CPU(不同的以太网MII/RMII等)具有各种引脚、时钟、电源等配置。每个都有相同的 TI OMAP SOC,因此它们都知道配置它的代码。 Device Tree是板子配置SOC使用硬件的输入。当找到特定的 SOC(或板)时,设备驱动程序可能具有改变行为的挂钩。

设备树是引导加载程序告诉内核存在哪些硬件以及应该配置哪些硬件的一种方式。


您可以使用多种方法与用户交谈 space。有些是具有不同用例的相同基础事物...

  1. 拨打系统新电话。
  2. 网络link
  3. 文件系统(设备文件)
  4. procfs
  5. sysfs
  6. debugfs
  7. 信号
  8. udev/mdev
  9. User-space GPIO
  10. select (file/socket)

3-6项基本相同。通常,文件是同步的。也就是说,如果您有 PIN 输出,它们就可以了,因为您可以从 user-space 写入它们。但是,假设您有一个输入引脚,例如自定义卡(子板)present/insert。也许您连接了一些 RS-232 电缆或 head-phone 插入引脚?使用文件接口,您必须轮询它们(或者您需要在内核代码中支持 inotify 等)。 netlink 是一种从内核向 user-space 提供消息的方法。如果您的引脚可以连接到系统中断(在任何情况下)是有意义的。

mdevudev 使用 netlink 告诉 user-space 关于 PCI、USB 等硬件 connected/disconnected。您可以对 GPIO 使用类似的方案。您只需使用 mdev/udev 脚本在 /sys/class/output/led1/dev/my_company/power_led 之间创建一个 link。

就个人而言,我想将命名放在用户 space 而不是内核中。例如,eth1 是什么?也许您想要一个 diagnosticmain 通信以太网端口?硬件可能不会在某些时候填充 诊断 端口以使 BOM 更便宜。那么也许 eth1eth0?