You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于SoC引脚定义配置:U-Boot与Linux设备树的差异及配置优先级问题

SoC引脚定义配置:U-Boot与Linux设备树的差异及配置优先级问题

嘿,这个问题问到点子上了——嵌入式Linux里引脚复用(pin-mux)的配置逻辑,确实是不少刚入坑的朋友容易懵的点,我结合实际开发经验给你掰扯清楚:

核心结论先拍板

Linux内核的引脚配置一定会覆盖U-Boot的配置,这点是确定的,不用纠结。

先搞懂两者的定位差异

  • U-Boot的引脚配置:纯粹是为了「启动阶段能干活」。比如你得初始化串口看启动日志、初始化Flash读内核和根文件系统、如果用TFTP启动还得初始化网口——这些都是启动必需的硬件,U-Boot里的引脚配置就是给这些启动外设铺路的。早期U-Boot可能是硬编码在板级代码(比如board/your_soc/your_board.c)里,现在部分新平台也支持用设备树,但核心目的都是让系统能顺利走完启动流程,配置是临时的。
  • Linux内核的引脚配置:是为了「整个系统运行阶段的所有外设」服务的。现在主流都是通过**设备树(Device Tree)**来统一管理,内核启动后会彻底接管硬件,遍历设备树里的&pinctrl节点,按照每个外设的需求重新初始化引脚控制器——不管U-Boot之前把引脚设成啥功能,内核都会用自己的配置覆盖掉。

引脚配置代码该放哪里?

给你分场景说:

  1. 只在启动阶段用的外设:比如启动时用的串口,只需要在U-Boot里配置就行,反正内核启动后如果这个串口还要用,会在设备树里重新配置;如果不用了,就让内核覆盖也没关系。
  2. 系统运行阶段需要的外设必须在Linux设备树里配置!比如I2C传感器、SPI显示屏、PCIe设备这些,你在U-Boot里配了也白搭,内核启动后会直接覆盖,只有设备树里的配置才是生效的。
  3. 特殊情况:如果某个引脚只在U-Boot阶段用(比如启动时的某个GPIO按键用来选择启动模式),内核完全不需要碰它,那可以只在U-Boot里配置,不用在设备树里写。但这种情况很少见,还是建议所有硬件配置尽量在设备树里统一管理,避免后期维护混乱。

补充个常见误区

有人会担心「U-Boot和内核配置冲突会不会搞坏硬件?」——完全不会。内核启动时会先重置引脚控制器的寄存器,然后再加载自己的配置,相当于把U-Boot的配置彻底清空了重来,所以根本不会有冲突残留。举个例子:U-Boot把PA0设成了SPI_CS,内核设备树里把PA0设成了GPIO输入,那内核启动后PA0就是标准的GPIO输入,之前的SPI功能完全失效。

备注:内容来源于stack exchange,提问作者Qiao

火山引擎 最新活动