设备树和代码大小

时间:2013-07-09 11:03:51

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

根据我对设备树的理解,其中一个主要用途是从驱动程序中删除特定于平台的代码以支持多个平台。 设备树如何处理单个外设的多个配置?

例如,如果我想在平台A中使用LCD面板A而在平台B中使用LCD面板B,我是否需要将LCD面板A和面板B相关代码保留在最终二进制文件中?如果是这种情况,并且有多个外围设备有多个选项,那么二进制文件中似乎会有大量额外的代码。

2 个答案:

答案 0 :(得分:6)

  

例如,如果我想在平台A中使用LCD面板A,在平台B中使用LCD面板B,那么我是否需要将LCD面板A和面板B相关代码保留在最终二进制文件中?

司机有三种情况。

  1. 完全不同的芯片和总线/子系统。
  2. 相同的总线/子系统,但芯片组不同。
  3. 相同的总线/子系统,相同的芯片组,不同的参数。
  4. 从这个你应该理解答案。对于LCD,驱动程序通常托管在SOC上,面板只是更改显示几何(1/4 VGA与1/2 VGA),时序等参数( 50Hz与75HZ)和可能的控制信号(OE有源低/高,有源/无源矩阵等)。实际上,设备树概念可以很好地处理这个问题。

    设备树之前,计算机文件会将平台数据传递给驱动程序;这包含上面提到的参数。由于机器文件是代码,因此面板A 面板B 的内核中必须包含这两个版本。这不是太糟糕,但对于具有1000个面板的Ubuntu类型版本,这可能是一个问题。以前,引导加载程序传递了一个计算机ID ,并且此键入了要使用的计算机文件。现在,设备树由引导加载程序传递,机器文件通常转换为设备树结构。

    现在,如果机器具有不同的以太网控制器芯片,则可以使用设备树和模块来降低内核大小。这是上面提到的2 nd 案例。

    3 rd 案例也可以用 modules 处理。例如, wifi 驱动程序和 HSDPA 调制解调器可以是不同平台上的通信机制。 802.11 子系统可以是一个模块,可以是 n-gsm 代码。此外, HSDPA 调制解调器可以使用USB或UART,而 wifi 可以使用 SPI SDIO 。其中一些代码可能无法转换模块,因为它可能与网络堆栈有一些紧密耦合。通常,我们会尽一切努力减少这种开销。

    一般来说,设备树概念实际上是在减少代码;至少在SDRAM中是一种非常重要的主要资源。 NAND闪存或其他大容量存储可能更大。您可以选择为特定硬件静态配置设备。如果您打算在一个映像中同时支持 panel ,那么设备树会更好。事实上,几乎在所有情况下它们都更好。

答案 1 :(得分:2)

假设您考虑是否有5个LCD面板和5个平台(机器),每个面板各保留5个dtsi文件,并为每个平台/机器提供不同的dtsi文件。

对于单一配置: 在您感兴趣的特定平台/机器的dtsi文件中包含特定的dtsi面板文件。 的结果:    - 通过这种方式,您不必通过电路板文件中的所有面板配置和开关LCD选项。简单来说,您不必为新机器创建单独的电路板文件,而是拥有多个设备树文件,并在构建期间包含您感兴趣的任何一个。

适用于多种配置: 您可以在您感兴趣的机器dtsi文件中添加n个面板dtsi文件。 通过在defconfig文件中启用/禁用特定的lcd面板,您可以在运行时启用任何LCD面板驱动程序。 的结果:   - 通过这种方式,你可以避免在单板文件中添加1000个面板配置(你知道它有多乱),而是拥有1000个dtsi文件并在机器dt文件中添加1000 dt头文件面板文件并在defconfig中引发特定的面板标志。这将缓解工作。 在简单的单板文件和包含所有文件的dtb中。减少整体内核大小。