自烧写测试

烧写错误 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";
};
网络驱动修改




ðernet0 {
status = "okay";
pinctrl-0 = <ðernet0_rgmii_pins_a>;
pinctrl-1 = <ðernet0_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 = <<dc_pins_b>;
pinctrl-1 = <<dc_pins_sleep_b>;
backlight = <&panel_backlight>;
status = "okay";
port {
panel_in_rgb: endpoint {
remote-endpoint = <<dc_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 节点追加一些内容,内容如下:
<dc {
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‑tuning、st,hs‑dc‑level里面的-不是英文减号,是中文长破折号‑! 肉眼看着像横线,但 dtc 编译器不认,直接报语法错误。
问题字符对比
- ❌ 错误(你现在的,中文破折号):
usb‑phy‑tuning - ✅ 正确(英文半角减号):
usb-phy-tuning
所有属性里面的横线全部要替换成英文 -: st,hs‑dc‑level → st,hs-dc-level st,fs‑rftime‑tuning → st,fs-rftime-tuning st,hs‑rftime‑reduction → st,hs-rftime-reduction st,hs‑current‑trim → st,hs-current-trim st,hs‑impedance‑trim → st,hs-impedance-trim st,squelch‑level → st,squelch-level st,hs‑rx‑offset → st,hs-rx-offset st,no‑lsfs‑sc → st,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;
};
操作步骤
- 删除原来 223 行开始这一整块,粘贴上面这段;
Ctrl+S保存文件;- 清理再编译