
自燒寫測試燒寫錯誤 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保存文件清理再編譯