设备树和代码大小

Rah*_*hul 1 kernel arm linux-device-driver linux-kernel device-tree

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

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

art*_*ise 6

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

司机有三种情况.

  1. 完全不同的芯片和总线/子系统.
  2. 相同的总线/子系统,但不同的芯片组.
  3. 相同的总线/子系统,相同的芯片组,不同的参数.

从这个你应该理解答案.对于LCD,驱动器通常托管在SOC上,面板只更改显示几何(1/4 VGA对1/2 VGA),时序(50Hz对75HZ)和可能的控制信号(OE有效低/高)等参数,主动/被动矩阵等).这实际上是通过设备树概念非常好地处理的.

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

现在,如果机器具有不同的以太网控制器芯片,则可以使用设备树和模块来降低内核大小.这是上面提到的第二种情况.

的3 的情况下也可以与处理模块.例如,wifi驱动程序和HSDPA调制解调器可以是不同平台上的通信机制.所述802.11子系统可以是一个模块并能正GSM代码.此外,HSDPA调制解调器可以使用USB或UART,而wifi可以使用SPISDIO.其中一些代码可能无法转换模块,因为它可能与网络堆栈有一些紧密耦合.通常,我们尽一切努力将这种开销降至最低.

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