配置STM32MP1的设备树
设备树基础知识设备树(.dts/.dtsi)以树形结构描述硬件资源,内核通过解析设备树动态加载驱动。
STM32MP1的设备树分为:
SoC级描述:stm32mp15.dtsi定义芯片内部资源,如CPU、时钟、GPIO控制器等。
板级描述:如stm32mp157c-dk2.dts定义开发板外设,如LED、按键、外部接口等。
获取设备树源码
设备树文件位于Linux内核源码的arch/arm/boot/dts/
目录:
git clone https://github.com/STMicroelectronics/linux.git
cd linux
git checkout stm32mp1
设备树文件结构
SoC级文件:stm32mp151.dtsi, stm32mp15xc.dtsi等。
板级文件:如stm32mp157c-dk2.dts,包含对SoC文件的引用:
#include "stm32mp157.dtsi"
#include "stm32mp15xc.dtsi"
#include "stm32mp15-pinctrl.dtsi" 配置设备树的步骤
步骤 1:定位目标设备树文件
根据开发板型号找到对应的.dts文件。例如:
STM32MP157C-DK2开发板:stm32mp157c-dk2.dts
步骤 2:修改外设配置
在板级设备树文件中启用或配置外设节点。以下以启用UART4为例:
启用UART4控制器:
dts
复制
&uart4 {
pinctrl-names = "default";
pinctrl-0 = <&uart4_pins_a>;// 使用预定义的引脚配置
status = "okay"; // 启用UART4
};
检查引脚复用配置:
在stm32mp15-pinctrl.dtsi中确认uart4_pins_a的定义:
dts
复制
uart4_pins_a: uart4-0 {
pins1 {
pinmux = <STM32_PINMUX('G', 11, AF6)>; // TX引脚
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
pins2 {
pinmux = <STM32_PINMUX('B', 2, AF8)>;// RX引脚
bias-disable;
};
};
步骤 3:配置其他外设
GPIO控制LED:
dts
复制
&gpiod {
status = "okay";
led {
compatible = "gpio-leds";
led-green {
gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>;
label = "heartbeat";
linux,default-trigger = "heartbeat";
};
};
};
I2C设备(如EEPROM):
dts
复制
&i2c1 {
status = "okay";
eeprom@50 {
compatible = "atmel,24c02";
reg = <0x50>;
};
}; 编译设备树
单独编译设备树:
make ARCH=arm CROSS_COMPILE=arm-none-eabi- dtbs
生成的设备树二进制文件(.dtb)位于arch/arm/boot/dts/目录。
重新编译内核(可选):
如果修改了公共依赖文件(如.dtsi),需重新编译内核:
make ARCH=arm CROSS_COMPILE=arm-none-eabi- -j$(nproc)
部署设备树
将生成的.dtb文件复制到开发板的/boot分区:
cp arch/arm/boot/dts/stm32mp157c-dk2.dtb /mnt/boot/
验证设备树
查看内核日志:
dmesg | grep -i "device tree"
检查外设状态:
确认外设是否被正确识别:
ls /sys/bus/platform/devices/# 查看注册的设备节点
调试工具:
使用dtc反编译.dtb文件,验证配置:
dtc -I dtb -O dts -o extracted.dts stm32mp157c-dk2.dtb 常见问题及解决
问题 1:外设未初始化
可能原因:设备树中status未设置为okay,或引脚复用冲突。
检查方法:
bash
复制
cat /proc/device-tree/<外设路径>/status
问题 2:设备驱动未加载
可能原因:设备树中的compatible属性与驱动不匹配。
调试命令:
bash
复制
echo -n "driver_compat_string" > /sys/bus/platform/drivers/driver_name/bind
总结
修改设备树文件:根据硬件需求调整外设节点(如status = "okay")。
编译与部署:生成.dtb并替换开发板上的旧文件。
验证与调试:通过内核日志和系统文件检查设备树是否生效。
通过设备树配置,可以灵活适配不同硬件设计,无需修改内核源码。如需进一步调试,可结合内核的CONFIG_DEBUG_DEVICE_TREE选项和devmem2工具直接查看寄存器状态。 配置STM32MP1的设备树时,别忘了在板级文件中正确引入SoC级文件,避免重复定义硬件资源。 如果你的外设没有正常工作,检查设备树节点中的status = "okay";是否已启用,默认可能是disabled。 修改设备树后,记得重新编译并替换对应的dtb文件,否则更改不会生效。 STM32MP1的设备树中,时钟配置很关键,特别是I2C、SPI等外设,时钟源和频率设置错误会导致无法正常工作。 在调试设备树时,可以通过dmesg | grep OF:来检查内核加载设备树的错误信息,快速定位问题。 编写设备树时,注意节点的命名规范,推荐遵循Linux内核的设备树命名规则,避免冲突。 如果遇到GPIO无法驱动的问题,检查设备树中引脚复用(pinmux)的配置是否正确,STM32MP1的引脚复用较为复杂。 为了便于调试,建议在设备树节点中加上compatible属性,并在驱动中打印日志,以便确认设备是否正确匹配。 STM32MP1的电源管理较为复杂,设备树中regulator节点配置错误可能会导致外设无法正常上电。 如果你在移植第三方外设时遇到问题,可以参考STM32MP1的官方设备树文件,很多常用外设的配置模板都在其中。
页:
[1]