打印
[STM32MP1]

配置STM32MP1的设备树

[复制链接]
115|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kmnqhaha|  楼主 | 2025-2-27 02:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
设备树基础知识
设备树(.dts/.dtsi)以树形结构描述硬件资源,内核通过解析设备树动态加载驱动。

STM32MP1的设备树分为:

SoC级描述:stm32mp15.dtsi定义芯片内部资源,如CPU、时钟、GPIO控制器等。

板级描述:如stm32mp157c-dk2.dts定义开发板外设,如LED、按键、外部接口等。


使用特权

评论回复
沙发
kmnqhaha|  楼主 | 2025-2-27 02:45 | 只看该作者
获取设备树源码
设备树文件位于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"

使用特权

评论回复
板凳
kmnqhaha|  楼主 | 2025-2-27 02:45 | 只看该作者
配置设备树的步骤
步骤 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>;
    };
};

使用特权

评论回复
地板
kmnqhaha|  楼主 | 2025-2-27 02:46 | 只看该作者
编译设备树
单独编译设备树:
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

使用特权

评论回复
5
kmnqhaha|  楼主 | 2025-2-27 02:46 | 只看该作者
常见问题及解决
问题 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工具直接查看寄存器状态。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

227

帖子

1

粉丝