如何在ARM Trusted Firmware中修改STM32MP的I2C引脚配置?
使用STM32MP处理器,通过ARM Trusted Firmware(ATF)与PMIC通信时,烧录固件出现**"I2C device not ready"**错误。经排查,问题源于I2C引脚配置错误:当前SDA、SCL引脚为PZ4和PZ5,需修改为PF14和PF15。目前I2C可正常初始化,但执行以下代码时触发错误:
ret = stm32_i2c_init(i2c, &i2c_init); if (ret != 0) { ERROR("Cannot initialize I2C %x (%d)\n", i2c->i2c_base_addr, ret); panic(); } if (!stm32_i2c_is_device_ready(i2c, pmic_i2c_addr, 1, I2C_TIMEOUT_BUSY_MS)) { ERROR("I2C device not ready\n"); panic(); }
针对STM32MP平台的ARM Trusted Firmware,按以下步骤修改引脚配置:
1. 定位引脚配置文件
STM32MP1的ATF引脚复用配置位于plat/st/stm32mp1/stm32mp1_pinmux.c,该文件定义了所有引脚的复用模式、上下拉和速度参数。
2. 替换I2C引脚配置
在文件中找到PMIC所用I2C控制器(通常为I2C4,PF14/PF15对应I2C4的SDA/SCL,需参考STM32MP1参考手册确认复用功能)的引脚定义:
将原有的PZ4/PZ5配置:
PINMUX_GRP(PZ4, PINMUX_MODE_AF4, PINMUX_PULL_UP, PINMUX_SPEED_MEDIUM), /* I2C4_SDA */ PINMUX_GRP(PZ5, PINMUX_MODE_AF4, PINMUX_PULL_UP, PINMUX_SPEED_MEDIUM), /* I2C4_SCL */
替换为PF14/PF15的配置:
PINMUX_GRP(PF14, PINMUX_MODE_AF4, PINMUX_PULL_UP, PINMUX_SPEED_MEDIUM), /* I2C4_SDA */ PINMUX_GRP(PF15, PINMUX_MODE_AF4, PINMUX_PULL_UP, PINMUX_SPEED_MEDIUM), /* I2C4_SCL */
注意:PINMUX_MODE_AF4是PF14/PF15作为I2C4引脚的正确复用模式,需严格匹配参考手册中的引脚功能定义。
3. 确认I2C控制器关联配置
检查plat/st/stm32mp1/include/plat_pmic.h或drivers/st/pmic/stm32mp_pmic.c,确保PMIC驱动使用的I2C实例(如I2C4)与修改后的引脚配置对应,避免控制器与引脚不匹配。
4. 重新编译ATF
修改完成后,使用交叉编译工具链重新编译ATF:
make CROSS_COMPILE=aarch64-none-linux-gnu- PLAT=stm32mp1 all
编译完成后,会生成BL31固件(build/stm32mp1/release/bl31.bin)。
5. 烧录验证
将新编译的BL31固件烧录到STM32MP开发板的对应分区,重启设备后检查I2C通信是否正常,确认不再触发"I2C device not ready"错误。
内容的提问来源于stack exchange,提问作者euraad

