野火 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 分支,因為網路原因有時下載會很慢,也可以通過其他倉庫路徑進行下載,不過可能出現下載不完整現象,導致無法編譯。

三、編譯內核

  1. 清理項目工程

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
    
  2. 設置默認配置文件

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- stm32mp157_ebf_defconfig
    
  3. 編譯 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
    
  4. 編譯生成deb
    也可以直接通過軟體包的形式,直接安裝內核
    直接執行 make_deb.sh 文件進行編譯

    ./make_deb.sh
    
  5. 生成文件的路徑
    zImage:/arch/arm/boot/目錄下
    dtb:/arch/arm/boot/dts目錄下

四、燒寫內核與設備樹

方式一、通過TFTp燒寫zImage與.dtb文件

  1. 將zImage和.dtb文件放入tftp伺服器中,不會的朋友可以看Linux安裝配置 tftp 伺服器

  2. 進入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命令查看網路是否連接,下圖中表示連接成功

  3. 下載zImage文件

    tftp 80800000 zImage
    
  4. 下載.dtb文件

    tftp 83000000 stm32mp157a-basic.dtb
    
  5. 啟動載入zImage和dtb文件

    bootz 80800000 - 83000000
    
  6. 驗證是否成功
    毫無疑問,驗證失敗,提示錯誤 Bad Linux ARM zImage magic!,這個應該是STM32MP157這塊開發板的分區問題導致的,目前只能嘗試後面幾種方式燒寫,後續我研究明白了在更新,有知道的大佬可以給個解決思路

方式二、通過安裝包燒寫內核

  1. 內核安裝包的執行過程,直接查看 make_deb.sh 文件

    vim make_deb.sh
    

    如下圖所示:

    • 第 4 行:指定編譯好的內核放置位置
    • 第 5 行:編譯出來的目標是針對 ARM 體系結構的內核
    • 第 6 行:對於 deb-pkg 目標,允許覆蓋 deb-pkg 部署的常規啟發式
    • 第 7 行:使用內核配置選項「LOCALVERSION」為常規內核版本附加一個唯一的後綴。
    • 第 10 行:指定交叉編譯器
    • 第 12 行:生成配置文件
    • 第 15 行:編譯文件進行打包
  2. 編譯

    ./make_deb.sh
    
  3. 查看當前內核

    dpkg -l | grep stm-r1
    

  4. 卸載當前內核

    sudo dpkg -r linux-image-4.19.94-stm-r1
    
  5. 安裝內核
    將編譯生成的內核通過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/*

  6. 驗證
    重啟開發板,使用 cat /proc/version 命令查看內核是否安裝成功,如下圖所示

方式三、直接替換內核文件

  1. 替換文件
    將編譯出來的 ebf_linux_kernel/arch/arm/boot/zImage 拷到板子上,替換/boot/kernel/vmlinuz-4.19.94-stm-r1 文件
    注意:這裡需要將zImage 文件重命名為vmlinuz-4.19.94-stm-r1 ,也可能會涉及到許可權問題。

  2. 添加軟鏈接

    ln -s /lib/modules/4.19.94-stm-r1 /lib/modules/4.19.94+
    
  3. 重啟驗證

    sudo reboot
    cat /proc/version
    
Tags: