高通平台DTS初始化硬件解析

4星 · 超过85%的资源 需积分: 44 33 下载量 190 浏览量 更新于2024-09-09 2 收藏 302KB PDF 举报
本文主要探讨高通平台如何利用DTS(Device Tree Source)初始化硬件,以高通8974平台为例,展示了Linux加载DTS设备节点的流程,旨在帮助学习高通平台的人理解这一过程。 在传统的ARMLinux系统中,针对不同硬件平台的特定代码大量存在于arch/arm/plat-xxx和arch/arm/mach-xxx目录下,这部分代码主要是关于板级配置的,但对内核来说并非必需,因此被称为“垃圾”代码。为了解决这个问题,Linux引入了DTS机制,用以描述硬件设备的详细信息,减少内核中的冗余代码。 DTS文件以一种结构化的数据格式定义了硬件的各个组件,如平台设备、资源、I2C和SPI设备等信息。在此不详细介绍DTS的具体语法,而是聚焦于其在Linux内核中的加载过程。 以高通8974平台为例,DTS文件首先描述了平台总线结构,如I2C总线。以下是一段示例代码: ``` / { model = "Qualcomm MSM8974"; compatible = "qcom,msm8974"; interrupt-parent = <&intc>; aliases { spi0 = &spi_0; spi7 = &spi_7; sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ sdhc2 = &sdhc_2; /* SDC2 SD card slot */ sdhc3 = &sdhc_3; /* SDC3 SDIO slot */ sdhc4 = &sdhc_4; /* SDC4 SDIO slot */ }; memory { secure_mem: secure_region { linux,contiguous-region; reg = <0x7800000>; label = "secure_mem"; }; adsp_mem: adsp_region { linux,contiguous-region; reg = <0x2000000>; }; ... }; }; ``` 加载DTS设备节点的过程主要分为以下几个步骤: 1. **解析DTS文件**:内核启动时,会读取指定的DTS文件并解析其中的节点和属性,构建出一个内存中的Device Tree结构。 2. **注册平台总线**:在解析过程中,内核识别到`/soc/i2c@78f0000`等节点,代表I2C总线。这些节点会被用来注册相应的总线驱动,比如i2c-mipi-i2c-bus驱动,使得内核知道如何与这些总线通信。 3. **创建设备节点**:对于每个描述平台设备的节点,如`/soc/spi@78f4000`,内核会根据其属性创建设备节点,并将其注册到对应的总线上。例如,SPI设备节点会被添加到I2C总线,以便后续驱动程序能正确地找到和初始化它们。 4. **分配资源**:DTS中的`reg`属性定义了设备的地址空间,内核会据此分配物理地址和中断等资源给设备。 5. **初始化设备驱动**:当设备节点和总线都准备就绪后,内核会查找匹配的驱动程序并加载,完成设备的初始化。例如,对于SD卡控制器(sdhc),对应的驱动程序会根据DTS中定义的信息进行配置。 6. **挂载文件系统**:最后,内核可以基于设备节点创建对应的/dev节点,以便用户空间的应用程序能够访问这些设备,如挂载SD卡。 通过这样的流程,DTS使得高通平台的硬件初始化过程更加清晰和模块化,降低了内核的复杂性,同时也便于不同平台之间的移植。对于开发者而言,理解和掌握DTS机制对于在高通平台上进行驱动开发和系统优化至关重要。