"Dynamic DTS方案是在Linux系统中,特别是在嵌入式设备中,用于实现硬件配置动态调整的一种技术。这种方案主要用于解决不同设备或项目间硬件差异导致的需要定制不同设备树 blob(DTB)的问题。通过动态DTS,可以减少镜像维护的复杂性,提高系统的可扩展性和灵活性。本文将详细介绍Dynamic DTS的基本原理和移植步骤,重点关注MT2712平台的应用。"
Dynamic DTS方案的核心是使Linux内核在启动过程中能够根据实际的硬件配置动态调整设备树。在MCU(微控制器)上电后,SOC(系统级芯片)的BootLoader(如MT2712的LK)通过IPCL(MCU与SOC之间的通信协议)从MCU接收boardinfo。boardinfo包含各种车型的硬件配置信息,如触摸屏大小(TPsize)、LCD尺寸、摄像头配置、背光设置以及DRAM参数等。
IPCL协议基于SPI(串行外围接口)实现,确保MCU与SOC间的高效通信。BootLoader在接收到boardinfo后,解析其中的信息,并使用这些信息修改内存中已加载的DTB文件。这个过程发生在eMMC中的DTB被加载到DRAM之后,BootLoader根据不同的boardinfo动态修改DTB的相应域,以适应不同的硬件配置。这样,即使对于不同的项目,只需要更新MCU中的boardinfo,就可以使用相同的系统镜像,降低了维护成本。
Dynamic DTS的移植工作主要包括两部分:
1. 添加IPCL支持:在BootLoader的bl33阶段,需要集成IPCL相关的源代码,包括`ipcl.c`、`ipcl.h`、`ipcl-helper.c`、`ipcl-helper.h`和`rules.mk`等文件。这些文件实现了基于SPI的IPCL通信协议,以及BootLoader从MCU接收和解析boardinfo的逻辑。
2. 实现动态DTS功能:BootLoader需要引入处理设备树的库`lib/fdt`,以及`dts_utils.c`、`dts_utils.h`和`dynamic_dts.c`等文件,这些文件负责在BootLoader阶段根据boardinfo动态修改DTB。`lib/fdt`库提供了处理设备树的函数,而`dts_utils`文件则包含了处理和修改DTB的具体操作。
Dynamic DTS方案是Linux系统在嵌入式领域实现硬件配置灵活适应的一种关键技术。它通过高效的通信机制和BootLoader阶段的DTB动态修改,使得不同硬件配置的项目可以共用一份系统镜像,大大简化了系统开发和维护的工作。