野火 STM32MP157 開發板內核和設備樹的編譯燒寫
一、環境
編譯環境:Ubuntu 版本:18.4.6
交叉編譯工具:arm-linux-gnueabihf-gcc 版本:7.4.1
開發板:STM32MP157 pro
燒寫方式:STM32CubeProgrammer、TFTP、在線燒寫
安裝工具
- gcc-arm-linux-gnueabihf 交叉編譯器
- bison 語法分析器
- flex 詞法分析器
- libssl-dev OpenSSL通用庫
- lzop LZO壓縮庫的壓縮軟體
sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop
下圖是我當前使用的工具版本,僅供參考
二、下載內核源碼
GitHub倉庫://github.com/Embedfire/ebf_linux_kernel
git clone -b ebf_4.19_star //github.com/Embedfire/ebf_linux_kernel.git
注意: STM32MP157 內核源碼對應的是 ebf_4.19_star 分支,因為網路原因有時下載會很慢,也可以通過其他倉庫路徑進行下載,不過可能出現下載不完整現象,導致無法編譯。
三、編譯內核
-
清理項目工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
-
設置默認配置文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- stm32mp157_ebf_defconfig
-
編譯 zImage 或 .dtb 文件
# 默認編譯內核和設備樹 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 # 編譯內核 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage # 編譯設備樹 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
-
編譯生成deb
也可以直接通過軟體包的形式,直接安裝內核
直接執行make_deb.sh
文件進行編譯./make_deb.sh
-
生成文件的路徑
zImage:/arch/arm/boot/目錄下
dtb:/arch/arm/boot/dts目錄下
四、燒寫內核與設備樹
方式一、通過TFTp燒寫zImage與.dtb文件
-
將zImage和.dtb文件放入tftp伺服器中,不會的朋友可以看Linux安裝配置 tftp 伺服器
-
進入uboot中配置網路
setenv ipaddr 192.168.30.156 setenv gatewayip 192.168.30.1 setenv netmask 255.255.255.0 setenv serverip 192.168.30.99 setenv ethaddr 00:01:12:13:14:15 saveenv
** 配置完成後可以通過
ping
命令查看網路是否連接,下圖中表示連接成功
-
下載zImage文件
tftp 80800000 zImage
-
下載.dtb文件
tftp 83000000 stm32mp157a-basic.dtb
-
啟動載入zImage和dtb文件
bootz 80800000 - 83000000
-
驗證是否成功
毫無疑問,驗證失敗,提示錯誤Bad Linux ARM zImage magic!
,這個應該是STM32MP157這塊開發板的分區問題導致的,目前只能嘗試後面幾種方式燒寫,後續我研究明白了在更新,有知道的大佬可以給個解決思路
方式二、通過安裝包燒寫內核
-
內核安裝包的執行過程,直接查看
make_deb.sh
文件vim make_deb.sh
如下圖所示:
- 第 4 行:指定編譯好的內核放置位置
- 第 5 行:編譯出來的目標是針對 ARM 體系結構的內核
- 第 6 行:對於 deb-pkg 目標,允許覆蓋 deb-pkg 部署的常規啟發式
- 第 7 行:使用內核配置選項「LOCALVERSION」為常規內核版本附加一個唯一的後綴。
- 第 10 行:指定交叉編譯器
- 第 12 行:生成配置文件
- 第 15 行:編譯文件進行打包
-
編譯
./make_deb.sh
-
查看當前內核
dpkg -l | grep stm-r1
-
卸載當前內核
sudo dpkg -r linux-image-4.19.94-stm-r1
-
安裝內核
將編譯生成的內核通過TFTP拷貝到開發板下,內核安裝包位於ebf_linux_kernel/build_image/linux-image-4.19.94-stm-r1_1stable_armhf.deb
sudo dpkg -i linux-image-4.19.94-stm-r1_1stable_armhf.deb
注意:若使用 dpkg 安裝內核 deb 包提示錯誤,刪除 boot/kernel 目錄下所有文件
sudo rm boot/kernel/*
-
驗證
重啟開發板,使用cat /proc/version
命令查看內核是否安裝成功,如下圖所示
方式三、直接替換內核文件
-
替換文件
將編譯出來的 ebf_linux_kernel/arch/arm/boot/zImage 拷到板子上,替換/boot/kernel/vmlinuz-4.19.94-stm-r1 文件
注意:這裡需要將zImage 文件重命名為vmlinuz-4.19.94-stm-r1 ,也可能會涉及到許可權問題。 -
添加軟鏈接
ln -s /lib/modules/4.19.94-stm-r1 /lib/modules/4.19.94+
-
重啟驗證
sudo reboot cat /proc/version