根据我对设备树的理解,主要用途之一是从驱动程序中删除特定于平台的代码以支持多个平台。设备树如何处理单个外设的多个配置?
例如,如果我想在平台 A 中使用 LCD 面板 A,在平台 B 中使用 LCD 面板 B,我是否需要在最终的二进制文件中保留 LCD 面板 A 和面板 B 的相关代码?如果是这种情况并且有多个外围设备具有多个选项,那么二进制文件中似乎会有大量的附加代码。
根据我对设备树的理解,主要用途之一是从驱动程序中删除特定于平台的代码以支持多个平台。设备树如何处理单个外设的多个配置?
例如,如果我想在平台 A 中使用 LCD 面板 A,在平台 B 中使用 LCD 面板 B,我是否需要在最终的二进制文件中保留 LCD 面板 A 和面板 B 的相关代码?如果是这种情况并且有多个外围设备具有多个选项,那么二进制文件中似乎会有大量的附加代码。
例如,如果我想在平台 A 中使用 LCD 面板 A,在平台 B 中使用 LCD 面板 B,那么我是否需要在最终的二进制文件中保留 LCD 面板 A 和面板 B 的相关代码?
司机有三种情况。
从这里你应该明白答案了。对于 LCD,驱动程序通常托管在 SOC 上,面板仅更改显示几何形状(1/4 VGA 与 1/2 VGA)、时序(50Hz 与 75HZ)和可能的控制信号(OE 低电平/高电平有效)等参数,主动/被动矩阵等)。设备树概念实际上处理得非常好。
在设备树之前,机器文件会将平台数据传递给驱动程序;这包含上面提到的参数。由于机器文件是代码,因此面板 A和面板 B的两个版本都必须包含在内核中。这还不错,但是对于具有 1000 多个面板的 Ubuntu 类型的版本,这可能是一个问题。以前,引导加载程序只传递一个机器 id,这决定了要使用的机器文件。现在,设备树由引导加载程序传递,机器文件通常转换为设备树结构。
现在,如果机器有不同的以太网控制器芯片,您可以同时使用设备树和模块来减小内核大小。这是上面提到的第二种情况。
第三种情况也可以用modules处理。例如,wifi驱动程序和HSDPA调制解调器可能是不同平台上的通信机制。802.11子系统可以是一个模块,可以是n -gsm码。此外,HSDPA调制解调器可以使用 USB 或 UART,而wifi可以使用SPI或SDIO。其中一些代码可能无法转换模块,因为它可能与网络堆栈有一些紧密耦合。通常会尽一切努力将这种开销降至最低。
所以一般来说,设备树的概念实际上是在减少代码;至少在 SDRAM 中,这是一种非常宝贵的主要资源。NAND 闪存或其他大容量存储可能更大。您可以选择为特定硬件静态配置设备。如果您打算在一个图像中支持两个面板,那么设备树会更好。事实上,它们几乎在所有情况下都更好。
假设如果您有 5 个 LCD 面板和 5 个平台(机器),则为每个面板保留 5 个 dtsi 文件,并为每个平台/机器拥有不同的 dtsi 文件。
对于单一配置: 在您感兴趣的特定平台/机器的 dtsi 文件中包含特定的 dtsi 面板文件。 结果: - 通过这种方式,您不必在电路板文件中传递所有面板配置和开关 LCD 选项。简单来说,您不必为新机器创建单独的板文件,而是拥有多个设备树文件并在构建期间包含您感兴趣的任何一个。
对于多重配置: 您可以在您感兴趣的机器 dtsi 文件中添加 n 个面板 dtsi 文件。通过在 defconfig 文件中启用/禁用特定的液晶面板,您可以在运行时启用任何液晶面板驱动程序。 结果: - 通过这种方式,您可以避免在单板文件中添加 1000 个面板配置(您知道它有多混乱),而是在机器 dt 文件中添加 1000 个 dt 头面板文件并在 defconfig 中提高特定的面板标志。这将减轻工作。在简单的单板文件和包含所有文件的 dtb 中。减小整体内核大小。