野火 STM32MP157 開發板核心和裝置樹的編譯燒寫

2022-11-03 18:00:25

一、環境

編譯環境: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倉庫:https://github.com/Embedfire/ebf_linux_kernel

git clone -b ebf_4.19_star  https://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