ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

stm32m157 U-boot 测试

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.stm32cd 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-phy0 { reg 0; }; }; };从图13.2.6.3中可以看到 “ethernet5800a00 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 地址 saveenvping 192.168.1.249STM32MP1 开发高频踩坑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.dtsiUSB 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; stusb160028 { 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接口的IOltdc_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: endpoint0 { reg 0; remote-endpoint panel_in_rgb; }; }; };执行 ./stm32mp157d_alientek.sh 报权限不够问题分析plaintextrm: 无法删除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目录下执行把整个源码目录所有者改回你当前普通用户userbashsudo chown -R $USER:$USER .执行完再跑你的编译脚本bash./stm32mp157d_alientek.shError: arch/arm/dts/stm32mp157d-atk.dtsi:223.17-31 syntax errorError: arch/arm/dts/stm32mp157d‑atk.dtsi:223.17‑31 syntax error FATAL ERROR: Unable to parse input tree报错指向第 223 行dtsusb_phy_tuning: usb‑phy‑tuning{问题根源设备树节点语法节点名称后面的左大括号{前面必须要有空格。 你代码dtsusb_phy_tuning: usb‑phy‑tuning{usb‑phy‑tuning和{紧贴在一起缺少空格DTC 编译器报语法错误。修改正确写法dtsusb_phy_tuning: usb‑phy‑tuning {在usb‑phy‑tuning与{之间加一个空格。完整修正片段dtsusb_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 useruser-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-levelst,fs‑rftime‑tuning→st,fs-rftime-tuningst,hs‑rftime‑reduction→st,hs-rftime-reductionst,hs‑current‑trim→st,hs-current-trimst,hs‑impedance‑trim→st,hs-impedance-trimst,squelch‑level→st,squelch-levelst,hs‑rx‑offset→st,hs-rx-offsetst,no‑lsfs‑sc→st,no-lsfs-sc完整正确代码复制这个这里全部是英文减号dtsusb_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 行开始这一整块粘贴上面这段CtrlS保存文件清理再编译
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表