stm32m157 U-boot 测试

自烧写测试

烧写错误 STM32CubeProgrammer 报错:ip parsing error: 'mmcl'

报错:Layout line 5: ip parsing error: 'mmcl' 根本原因:Tsv 配置文件写错,IP 字段写了mmcl,正确是mmc1(数字 1,不是字母 l L 的小写)。 看截图表格:

你的 ssb1 那一行 IP 列写的是 mmcl,把数字 1 写成字母 L 小写 l

这里也要选对

复制代码
#Opt	Id	Name	Type	Device	Offset	Binary
-	0x01	fsbl1-boot	Binary	none	0x0	tf-a-stm32mp157d-atk-serialboot.stm32
-	0x03	ssbl-boot	Binary	none	0x0	u-boot.stm32
P	0x04	fsbl1	Binary	mmc1	boot1	tf-a-stm32mp157d-atk-trusted.stm32
P	0x05	fsbl2	Binary	mmc1	boot2	tf-a-stm32mp157d-atk-trusted.stm32
P	0x06	ssbl	Binary	mmc1	0x00080000	my-u-boot.stm32
复制代码
cd configs //进入 uboot 的 configs 目录 
cp stm32mp15_trusted_defconfig stm32mp15_atk_trusted_defconfig //拷贝 

此时在 uboot 的 configs 目录下就存在一个名为"stm32mp15_atk_trusted_defconfig"的默认 配置文件,这个默认配置文件就是给我们开发板使用的。

创建默认配置设备树

在 uboot 的源码目录下,运行以下命令:

复制代码
cd arch/arm/dts/ //进入 uboot 设备树目录 
cp stm32mp157d-ed1.dts stm32mp157d-atk.dts //复制.dts 
cp stm32mp15xx-edx.dtsi stm32mp157d-atk.dtsi //复制.dtsi 
cp stm32mp157a-ed1-u-boot.dtsi stm32mp157d-atk-u-boot.dtsi //复制.dtsi 

修改电源管理设置

复制代码
&sdmmc1 {
    pinctrl-names = "default", "opendrain", "sleep";
    pinctrl-0 = <&sdmmc1_b4_pins_a>;
    pinctrl-1 = <&sdmmc1_b4_od_pins_a>;
    pinctrl-2 = <&sdmmc1_b4_sleep_pins_a>;
    st,neg-edge;
    broken-cd;
    bus-width = <4>;
    vmmc-supply = <&v3v3>;
    status = "okay";
};

&sdmmc2 {
    pinctrl-names = "default", "opendrain", "sleep";  pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;
    pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;
    pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;
    non-removable;
    st,neg-edge;
    bus-width = <8>;
    vmmc-supply = <&v3v3>;
    keep-power-in-suspend;
    status = "okay";
};

网络驱动修改

复制代码
&ethernet0 { 


status = "okay"; 
pinctrl-0 = <&ethernet0_rgmii_pins_a>; 
pinctrl-1 = <&ethernet0_rgmii_pins_sleep_a>; 
pinctrl-names = "default", "sleep"; 
phy-mode = "rgmii-id"; 
max-speed = <1000>; 
phy-handle = <&phy0>; 

 mdio0 { 
 	#address-cells = <1>; 
 	#size-cells = <0>; 
 	compatible = "snps,dwmac-mdio"; 
 	phy0: ethernet-phy@0 { 
 			reg = <0>; 
 }; 
 }; 
}; 


从图 13.2.6.3 中可以看到 "ethernet@5800a00 address not set."字样,说明已经找到了网络
外设并且网络外设已经启动,但是还是会报"No ethernet found."错误,这是因为 uboot 启动的
时候获取不到 MAC 地址,我们只需要设置一些地址相关的环境变量即可,前面讲解 uboot 的


设置好地址相关环境变量以后就可以在 uboot 中使用网络了,用网线将开发板上的网络接
口与电脑或者路由器连接起来,保证开发板和电脑在同一个网段内,通过 ping 命令来测试一
下网络连接,命令如下:
网络相关命令的时候已经讲过了,命令如下:

复制代码
setenv ipaddr 192.168.1.250 //开发板 IP 地址
setenv ethaddr 00:04:9f:04:d2:35 //开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.1.249 //服务器地址,也就是 Ubuntu 地址
saveenv

ping 192.168.1.249

STM32MP1 开发高频踩坑:1(数字一) 和 l(L 小写) 看混

复制代码
#include "stm32mp157.dtsi"
#include "stm32mp15xd.dtsi"
#include "stm32mp15-pinctrl.dtsi"
#include "stm32mp15xxaa-pinctrl.dtsi"
#include "stm32mp157-m4-srm.dtsi"
#include "stm32mp157-m4-srm-pinctrl.dtsi"
#include "stm32mpl57d-atk.dtsi"

#include "stm32mpl57d-atk.dtsi" 应该是#include "stm32mp157d-atk.dtsi"


USB OTG****设备树修改
1**、添加usb_phy_tuning子节点**
在这一小节里,我们就给 uboot 添加 USB_OTG 功能,操作 stm32mp157d-atk.dtsi 这个文件,
在根节点"/"下添加名为"usb_phy_tuning"的子节点,节点内容如下:

复制代码
usb_phy_tuning: usb-phy-tuning {
    st,hs-dc-level = <2>;
    st,fs-rftime-tuning;
    st,hs-rftime-reduction;
    st,hs-current-trim = <15>;
    st,hs-impedance-trim = <1>;
    st,squelch-level = <3>;
    st,hs-rx-offset = <2>;
    st,no-lsfs-sc;
};

添加STUSB1600 I2C子节点
正点原子 STM32MP157 开发板上的 USB OTG 接口类型为 Type-C,使用 STUSB1600 芯片
来实现此接口功能,STUSB1600 有一个 I2C 接口,此 I2C 接口用来配置芯片,因此我们还需要
在设备树中添加 STUSB1600 相关的 I2C 节点内容。将如下内容添加到 stm32mp157d-atk.dtsi 的
最后面:

复制代码
&i2c1 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&i2c1_pins_a>;
    pinctrl-1 = <&i2c1_pins_sleep_a>;
    i2c-scl-rising-time-ns = <100>;
    i2c-scl-falling-time-ns = <7>;
    status = "okay";
    /delete-property/dmas;
    /delete-property/dma-names;

    stusb1600@28 {
        compatible = "st,stusb1600";
        reg = <0x28>;
        interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
        interrupt-parent = <&gpiog>;
        pinctrl-names = "default";
        pinctrl-0 = <&stusb1600_pins_a>;
        status = "okay";
        vdd-supply = <&vin>;
        connector {
            compatible = "usb-c-connector";
            label = "USB-C";
            power-role = "dual";
            power-opmode = "default";

            port {
                con_usbotg_hs_ep: endpoint {
                    remote-endpoint = <&usbotg_hs_ep>;
                };
            };
        };
    };
};

由于 STUSB1600 是挂在 STM32MP157 的 I2C1 接口下,因此示例代码 13.2.7.2 是向 I2C1
节点追加内容,stusb1600 节点
添加usb接口相关节点
继续向 stm32mp157d-atk.dtsi 文件添加 USB 接口相关节点内容,内容如下:

复制代码
&usbh_ehci {
    phys = <&usbphyc_port0>;
    status = "okay";
};

&usbotg_hs {
    phys = <&usbphyc_port1 0>;
    phy-names = "usb2-phy";
    usb-role-switch;
    status = "okay";

    port {
        usbotg_hs_ep: endpoint {
            remote-endpoint = <&con_usbotg_hs_ep>;
        };
    };
};

&usbphyc {
    status = "okay";
};

上述代码中有三个节点 usbh_ehci、usbotg_hs 和 usbphyc,其中 usbotg_hs 默认就有,我们
在前面将其屏蔽掉了,完成以后如图 13.2.7.3 所示:
stm32mp157d-atk-u-boot.dtsi文件中添加usbotg_hs节点
最后,我们需要在 stm32mp157d-atk-u-boot.dtsi 文件里面添加 usbotg_hs 节点,节点内容如
下所示:

复制代码
&usbotg_hs {
    phys = <&usbphyc_port1 0>;
    phy-names = "usb2-phy";
    u-boot,force-b-session-valid;
    hnp-srp-disable;
    /* TEMP: force peripheral for USB OTG */
    dr_mode = "peripheral";
// 删掉 usb-role-switch;

    port {
        usbotg_hs_ep: endpoint {
            remote-endpoint = <&con_usbotg_hs_ep>;
        };
    };
};

至此,uboot 下的 USB OTG 就已经修改完成,重新编译 uboot 并烧写,然后使用 ums 命令
测试,看看能不能将 EMMC 模拟成 U 盘,挂载到电脑上,命令如下:
做到这里,保存修改的文件,编译和拷贝。把 STM32MP157D-ATK 开发板的 USB_OTG 接
口连接到电脑里,重启开发板,接着运行以下命令:

复制代码
ums 0 mmc 1

如果电脑上出现如图 13.2.7.5 所示的磁盘,说明 USB OTG 工作成功

LCD****驱动修改

RGB LCD 7 寸 1024×600 屏幕节点
uboot 也是支持 LCD 显示的,但是要进行相应的设置,主要是设置屏幕背光、屏幕时序参
数这些,这些直接在设备树里面修改即可。打开 stm32mp157d-atk.dts 文件,在里面添加 LCD 相
关节点信息,首先在根节点"/"下添加 panel_backlight 和 panel_rgb 这两个节点,节点内容如
下:

复制代码
panel_backlight: panel-backlight {
    compatible = "gpio-backlight";
    gpios = <&gpiod 13 GPIO_ACTIVE_HIGH>;
    default-on;
    status = "okay";
};

panel_rgb: panel-rgb {
    compatible = "simple-panel";
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&ltdc_pins_b>;
    pinctrl-1 = <&ltdc_pins_sleep_b>;
    backlight = <&panel_backlight>;
    status = "okay";

    port {
        panel_in_rgb: endpoint {
            remote-endpoint = <&ltdc_ep0_out>;
        };
    };

    display-timings {
        native-mode = <&timing0>;
        timing0: timing0 { /* 7寸 1024*600 */
            clock-frequency = <51200000>;
            hactive = <1024>;
            vactive = <600>;
            hfront-porch = <160>;
            hback-porch = <140>;
            hsync-len = <20>;
            vback-porch = <20>;
            vfront-porch = <12>;
            vsync-len = <3>;
        };
    };
};

第 1~6 行,panel_backlight 为 LCD 的背光控制节点,主要指定 LCD 背光 IO 所使用的引
脚,正点原子的 STM32MP157 开发板 LCD 背光引脚为 PD13。
第 8~38 行,panel_rgb 为 RGB LCD 节点,指定了 LTDC 接口所使用的 IO、屏幕时序参数
等。第 11~12 行指定 LTDC 接口的 IO,ltdc_pins_b 和 ltdc_pins_sleep_b 定义在 stm32mp15-
pinctrl.dtsi 文件中。第 22~35 行的 display-timings 是非常重要的 LCD 时序参数,不同的屏幕其
时序参数不同,这里演示的是正点原子 7 寸 1024*600 分辨率的。正点原子有 4 款 RGB 接口屏
幕,分别为 4.3 寸 480*272 和 800*480 分辨率、7 寸 800*480 和 1024*600 分辨率,这款屏幕时
序参数如表 13.2.9.1 所示:

最后还需要在 stm32mp157d-atk.dts 文件里面向 ltdc 节点追加一些内容,内容如下:

复制代码
&ltdc {
    status = "okay";
    pinctrl-names = "default";
    port {
        #address-cells = <1>;
        #size-cells = <0>;

        ltdc_ep0_out: endpoint@0 {
            reg = <0>;
            remote-endpoint = <&panel_in_rgb>;
        };
    };
};

执行 ./stm32mp157d_alientek.sh 报权限不够

问题分析

plaintext

复制代码
rm: 无法删除'include/config/dtc.h': 权限不够

报错核心:include/config 下面的文件所有者不是当前普通用户 user,大概率之前用 sudo/root 编译过 uboot,生成的头文件属于 root,现在普通用户执行脚本清理,删不掉 root 的文件

现象:uboot 的 make clean / make distclean 会尝试删除 include/config/*,文件是 root 权限,普通 user 无删除权限。

方案 1:修复目录文件权限(推荐,不要一直用 sudo 编译 uboot)

my_uboot 目录下执行,把整个源码目录所有者改回你当前普通用户 user

bash

复制代码
sudo chown -R $USER:$USER .

执行完,再跑你的编译脚本:

bash

复制代码
./stm32mp157d_alientek.sh

Error: arch/arm/dts/stm32mp157d-atk.dtsi:223.17-31 syntax error

复制代码
Error: arch/arm/dts/stm32mp157d‑atk.dtsi:223.17‑31 syntax error
FATAL ERROR: Unable to parse input tree

报错指向第 223 行

dts

复制代码
usb_phy_tuning: usb‑phy‑tuning{

问题根源

设备树节点语法:节点名称后面的左大括号 { 前面必须要有空格。 你代码:

dts

复制代码
usb_phy_tuning: usb‑phy‑tuning{

👉 usb‑phy‑tuning{ 紧贴在一起,缺少空格,DTC 编译器报语法错误。

修改正确写法

dts

复制代码
usb_phy_tuning: usb‑phy‑tuning {

usb‑phy‑tuning{ 之间加一个空格。

完整修正片段:

dts

复制代码
usb_phy_tuning: usb‑phy‑tuning {
    st,hs‑dc‑level = <2>;
    st,fs‑rftime‑tuning;
    st,hs‑rftime‑reduction;
    st,hs‑current‑trim = <15>;
    st,hs‑impedance‑trim = <1>;
    st,squelch‑level = <3>;
    st,hs‑rx‑offset = <2>;
    st,no‑lsfs‑sc;
};

Error: arch/arm/dts/stm32mp157d-atk.dtsi:223.17-20 syntax error
FATAL ERROR: Unable to parse input tree
scripts/Makefile.lib:308: recipe for target 'arch/arm/dts/stm32mp157d-atk.dtb' failed
make [2]: *** [arch/arm/dts/stm32mp157d-atk.dtb] Error 1
make [2]: *** 正在等待未完成的任务....
dts/Makefile:38: recipe for target 'arch-dtbs' failed
make [1]: *** [arch-dtbs] Error 2
Makefile:1090: recipe for target 'dts/dt.dtb' failed
make: *** [dts/dt.dtb] Error 2
user@user-virtual-machine:~/linux/atk-mp usb_phy_tuning: usb‑phy‑tuning {
st,hs‑dc‑level = <2>;
st,fs‑rftime‑tuning;
st,hs‑rftime‑reduction;
st,hs‑current‑trim = <15>;
st,hs‑impedance‑trim = <1>;
st,squelch‑level = <3>;
st,hs‑rx‑offset = <2>;
st,no‑lsfs‑sc;
};

错误定位

报错:stm32mp157d‑atk.dtsi:223.17‑20 syntax error,现在行号直接指向源文件 223 行,就是 usb_phy_tuning: usb‑phy‑tuning { 这一行。

看你贴出来的代码里所有横线:usb‑phy‑tuningst,hs‑dc‑level 里面的 - 不是英文减号,是中文长破折号 ! 肉眼看着像横线,但 dtc 编译器不认,直接报语法错误。

问题字符对比

  • ❌ 错误(你现在的,中文破折号):usb‑phy‑tuning
  • ✅ 正确(英文半角减号):usb-phy-tuning

所有属性里面的横线全部要替换成英文 -st,hs‑dc‑levelst,hs-dc-level st,fs‑rftime‑tuningst,fs-rftime-tuning st,hs‑rftime‑reductionst,hs-rftime-reduction st,hs‑current‑trimst,hs-current-trim st,hs‑impedance‑trimst,hs-impedance-trim st,squelch‑levelst,squelch-level st,hs‑rx‑offsetst,hs-rx-offset st,no‑lsfs‑scst,no-lsfs-sc

完整正确代码(复制这个,这里全部是英文减号)

dts

复制代码
usb_phy_tuning: usb-phy-tuning {
    st,hs-dc-level = <2>;
    st,fs-rftime-tuning;
    st,hs-rftime-reduction;
    st,hs-current-trim = <15>;
    st,hs-impedance-trim = <1>;
    st,squelch-level = <3>;
    st,hs-rx-offset = <2>;
    st,no-lsfs-sc;
};

操作步骤

  1. 删除原来 223 行开始这一整块,粘贴上面这段;
  2. Ctrl+S保存文件;
  3. 清理再编译
相关推荐
workflower2 小时前
智能无人机成低空经济核心赛道
运维·人工智能·机器学习·机器人·云计算·无人机
野生码农AI实战2 小时前
奇耻大辱,我的网站被挂马,服务器已沦陷三个月
服务器
ShineWinsu2 小时前
对于C++:缓冲区管理的详细解析
linux·c++·面试·编程·笔试·io·缓冲区
jason.zeng@15022072 小时前
服务器磁盘读写效率,网络吞吐量查看,mysql性能调优
服务器·网络·mysql
张小姐的猫2 小时前
【Linux】网络编程 —— 传输层协议 TCP(下)
linux·运维·服务器·网络·tcp/ip·http·php
程序员AlbertTu3 小时前
第2章 上手 Linux:环境与文件操作
linux·运维·服务器
☆凡尘清心☆3 小时前
CentOS Stream 9 源码编译搭建 Zabbix7.0.29 完整部署方案(部署成功)
linux·运维·centos
Escalating_xu3 小时前
【Linux】进程间通信:从匿名管道、FIFO 到共享内存、消息队列与信号量
java·linux·面试
予昊3 小时前
Linux 资源控制实战分析:用 LXC 亲手造一个 “迷你虚拟机“
linux·运维·服务器