本文章為《STM32MP157 Linux系統移植開發篇》系列中的一篇,筆者使用的開發平臺為華清遠見FS-MP1A開發板(STM32MP157開發板)。stm32mp157是ARM雙核,2個A7核,1個M4核,A7核上可以跑Linux操作系統,M4核上可以跑FreeRTOS、RT-Thread等實時操作系統,STM32MP157開發板所以既可以學嵌入式linux,也可以學stm32單片機。
針對FS-MP1A開發板,除了Linux系統移植篇外,還包括其他多系列教程,包括Cortex-A7開發篇、Cortex-M4開發篇、擴展板驅動移植篇、Linux應用開發篇、FreeRTOS系統移植篇、Linux驅動開發篇、硬件設計篇、人工智能機器視覺篇、Qt應用編程篇、Qt綜合項目實戰篇等。
————————————————
系統移植前說明
關于命令行提示符:
在實驗步驟中會涉及到執行命令的操作,為區分操作是在Ubuntu上完成還是在開發板上完成,不同操作會有不同的提示符:
Ubuntu操作時命令行提示符為:linux@ubuntu:$
開發板Linux系統下操作時命令行提示符為:root@fsmp1a:$
開發板u-boot期間操作是命令行提示符為:STM32MP>
注意:由于部分操作需要進入特定目錄下完成,導致命令行提示符較長如:
linux@ubuntu:~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/u-boot-stm32mp-2020.01-r0/u-boot-stm32mp-2020.01$
過長的命令行提示符不便于文檔編寫,所以本文中所有命令行提示符均忽略了當前工作目錄的顯示,命令行提示符不代表當前目錄,具體當前操作是在哪個目錄下完成,請結合文檔上下文確定。
?
1. 源碼編譯
1.1 源碼目錄結構
1.1.1 編譯環境配置
由于OpenSTLinux所涉及到的源碼較多,且有路徑的依賴。所以請按照本文的說明建立源碼文件夾。
在用戶home目錄下建立fs-mp1a文件夾。
linux@ubuntu: $ cd ~
linux@ubuntu: $ mkdir fs-mp1a
將工作目錄切換到fs-mp1a目錄下,建立linux、optee-os、trusted-firmware、u-boot、tools文件夾
linux@ubuntu: $ cd ~/fs-mp1a
linux@ubuntu: $ mkdir linux optee-os trusted-firmware u-boot tools
?
請務必按照此目錄名稱建立文件夾,否則會導致后續的OpenSTLinux系統編譯錯誤。
?
1.1.2 SDK工具鏈安裝
- ?
?
OpenSTLinux SDK是Yocto SDK定制發行版的軟件開發套件,它提供了獨立的交叉開發工具鏈和針對特定鏡像中所使用到的特定鏈接庫。
開發資料光盤中提供的SDK是基于FS-MP1A開發板的定制交叉編譯工具鏈,該工具鏈可用于FS-MP1A開發板中所有項目的編譯與調試。
將資料光盤下【華清遠見-FS-MP1A開發資料\01-工具軟件】的en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz復制到ubuntu主機中,可以采用共享文件夾的方式也可以使用tfp方式將文件存入FS-MP1A源碼目錄下的tools文件夾下進行解壓。
linux@ubuntu: $ tar -xvf en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz -C /home/linux/fs-mp1a/tools/
解壓之后得到sdk目錄,進入到sdk文件夾之后內容如下。
?
執行st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh安裝腳本。
linux@ubuntu: $ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh
運行之后會提示輸入安裝位置,直接按回車鍵默認即可:
?
繼續詢問是否安裝SDK,輸入Y,回車
?
默認安裝路徑安裝在opt目錄下,這個目錄需要有root權限,所以安裝時需要使用sudo安裝,過程中需要輸入用戶的sudo密碼(如果當前用戶sudo功能已經授權,這個密碼就是用戶的登錄密碼),輸入密碼后開始進行安裝。
?
輸入密碼后等待安裝,安裝后顯示如下:
?
導入sdk
linux@ubuntu: $ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
驗證開發工具是否安裝正確,顯示版本信息如下圖所示。
linux@ubuntu: $ $CC --version
?
1.1.3 源碼導入
- ?
?
Bootloader源碼
?
將光盤資料中【華清遠見-FS-MP1A開發資料\02-程序源碼\05-預裝系統源碼\u-boot】下的u-boot-fsmp1a-2020.01.tar.xz和Makefile.sdk導入到fs-mp1a目錄下u-boot文件夾中
將u-boot-fsmp1a-2020.01.tar.xz解壓之后得到u-boot-fsmp1a-2020.01文件夾
linux@ubuntu:$ tar -xvf u-boot-fsmp1a-2020.01.tar.xz
?
? ? ?trusted-firmware源碼
?
將光盤資料中【華清遠見-FS-MP1A開發資料\02-程序源碼\05-預裝系統源碼\tf-a】下的fsmp1a-trusted-firmware-2.2.tar.xz和Makefile.sdk導入到fs-mp1a目錄下trusted-firmware文件夾中
將fsmp1a-trusted-firmware-2.2.tar.xz解壓之后得到fsmp1a-trusted-firmware-2.2文件夾
linux@ubuntu:$ tar -xvf fsmp1a-trusted-firmware-2.2.tar.xz
?
optee_os源碼
將光盤資料中【華清遠見-FS-MP1A開發資料\02-程序源碼\05-預裝系統源碼\optee】下的fsmp1a-optee_os-3.9.0.tar.xz和Makefile.sdk導入到fs-mp1a目錄下optee-os文件夾中
將fsmp1a-optee_os-3.9.0.tar.xz解壓之后得到fsmp1a-optee_os-3.9.0文件夾
linux@ubuntu:$ tar -xvf fsmp1a-optee_os-3.9.0.tar.xz
?
?
linux源碼
盤資料中【華清遠見-FS-MP1A開發資料\02-程序源碼\05-預裝系統源碼\linux】下的fsmp1a-linux-5.4.31.tar.xz導入到fs-mp1a目錄下linux文件夾中
將fsmp1a-linux-5.4.31.tar.xz解壓之后得到fsmp1a-linux-5.4.31文件夾
linux@ubuntu:$ tar -xvf fsmp1a-linux-5.4.31.tar.xz
?
Yocto源碼
盤資料中【華清遠見-FS-MP1A開發資料\02-程序源碼\05-預裝系統源碼\Yocto】下的fsmp1a-ST-Yocto.tar.xz導入到fs-mp1a目錄下
將fsmp1a-ST-Yocto.tar.xz解壓之后得到fsmp1a-ST-Yocto文件夾
linux@ubuntu:$ tar -xvf fsmp1a-ST-Yocto.tar.xz
盤資料中【華清遠見-FS-MP1A開發資料\02-程序源碼\05-預裝系統源碼\Yocto】下的downloads.tar.xz導入到由fsmp1a-ST-Yocto.tar.xz得到的fsmp1a-ST-Yocto文件夾下。
將downloads.tar.xz解壓之后得到downloads文件夾。
linux@ubuntu:$ tar -xvf downloads.tar.xz
?
?
至此OpenSTLinux全部源碼就導入完成了。導入源碼完成后的fs-mp1a目錄結構如下。
?
?
1.2 u-boot源碼編譯
導入交叉編譯工具鏈并驗證
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
linux@ubuntu:$$CC --version
?
?
將工作目錄切換到u-boot-fsmp1a-2020.01源碼目錄下。
linux@ubuntu:$ cd ${HOME}/fs-mp1a/u-boot/u-boot-fsmp1a-2020.01
?
?
導入配置文件。
fsmp1a的u-boot可以支持basic、trusted、optee三種配置。分別對應三種配置文件。
?
?
這里使用trusted配置來編譯
linux@ubuntu:$ make stm32mp15_trusted_defconfig
?
?
編譯源碼
linux@ubuntu:$ make DEVICE_TREE=stm32mp157a-fsmp1a all
編譯完成后得到u-boot.img文件
?
?
使用Makefile.sdk編譯
除了傳統的編譯方式之外還可以通過上層目錄下的Makefile.sdk來編譯鏡像。使用此方法需要將先前編譯過的源碼清除后再編譯,否則會導致編譯出錯。
linux@ubuntu:$ make distclean
編譯basic鏡像
linux@ubuntu:$ make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_basic_defconfig,basic,u-boot.img
編譯成功后會在上級目錄下生成build-basic目錄。其中的u-boot-stm32mp157a-fsmp1a-basic.img和u-boot-spl.stm32-stm32mp157a-fsmp1a-basic即為生成的燒寫鏡像
?
編譯trusted鏡像
linux@ubuntu:$make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_trusted_defconfig,trusted,u-boot.stm32
編譯成功后會在上級目錄下生成build-trusted目錄。其中的u-boot-stm32mp157a-fsmp1a-trusted.stm32即為生成的燒寫鏡像
?
?
編譯optee鏡像
linux@ubuntu:$ make -f $PWD/../Makefile.sdk all UBOOT_CONFIGS=stm32mp15_fsmp1a_trusted_defconfig,optee,u-boot.stm32
編譯成功后會在上級目錄下生成build-optee目錄。其中的u-boot-stm32mp157a-fsmp1a-optee.stm32即為生成的燒寫鏡像
?
?
編譯basic、trusted、optee三種鏡像
linux@ubuntu:$ make -f $PWD/../Makefile.sdk all
編譯成功后會在上級目錄下會同時生成build-basic、build-trusted、build-optee三個目錄。
?
?
?
1.3 tf-a源碼編譯
導入交叉編譯工具鏈并驗證
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
linux@ubuntu:$ $CC --version
?
?
將工作目錄切換到fsmp1a-trusted-firmware-2.2源碼目錄下。
linux@ubuntu:$ cd ${HOME}/fs-mp1a/trusted-firmware/fsmp1a-trusted-firmware-2.2
編譯trusted鏡像
linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=trusted ELF_DEBUG_ENABLE='1' all
編譯成功之后會在上級目錄下生成build目錄,build目錄下的trusted目錄中tf-a-stm32mp157a-fsmp1a-trusted.stm32即為燒寫鏡像。
?
?
編譯optee鏡像
linux@ubuntu:$ make -f $PWD/../Makefile.sdk TFA_DEVICETREE=stm32mp157a-fsmp1a TF_A_CONFIG=optee ELF_DEBUG_ENABLE='1' all
編譯成功之后會在上級目錄下生成build目錄,build目錄下的optee目錄中tf-a-stm32mp157a-fsmp1a-optee.stm32即為燒寫鏡像。
?
?
編譯trusted、optee兩種鏡像
linux@ubuntu:$ make -f $PWD/../Makefile.sdk all
編譯成功后會在上級目錄下生成build目錄,該目錄下同時生成了trusted和optee兩個目錄。
?
?
1.4 optee-os源碼編譯
?
導入交叉編譯工具鏈并驗證
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
linux@ubuntu:$ $CC --version
?
?
將工作目錄切換到fsmp1a-optee_os-3.9.0源碼目錄下。
linux@ubuntu:$ cd ${HOME}/fs-mp1a/optee-os/fsmp1a-optee_os-3.9.0
?
?
編譯源碼
linux@ubuntu:$ make -f $PWD/../Makefile.sdk CFG_EMBED_DTB_SOURCE_FILE=stm32mp157a-fsmp1a
編譯成功之后會在上級目錄下生成build目錄其目錄下的tee-header_v2-stm32mp157a-fsmp1a-optee.stm32、tee-pageable_v2-stm32mp157a-fsmp1a-optee.stm32、tee-pager_v2-stm32mp157a-fsmp1a-optee.stm32即為燒寫鏡像。
?
?
?
1.5 linux源碼編譯
?
導入交叉編譯工具鏈并驗證
linux@ubuntu:$ linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
linux@ubuntu:$ $CC --version
?
?
將工作目錄切換到fsmp1a-linux-5.4.31源碼目錄下。
linux@ubuntu:$cd ${HOME}/fs-mp1a/linux/fsmp1a-linux-5.4.31
?
?
導入配置文件
linux@ubuntu:$make stm32_fsmp1a_defconfig
?
?
如果需要修改配置可以使用如下命令來啟動menuconfig
linux@ubuntu:$make menuconfig
?
編譯內核鏡像
linux@ubuntu:$make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040
編譯成功之后會在arch/arm/boot/目錄下生成uImage文件
?
?
在源碼目錄下生成用于調試的vmlinux文件
?
?
編譯設備樹文件
linux@ubuntu:$make ARCH=arm dtbs
編譯成功之后會在arch/arm/boot/dts目錄下生成stm32mp157a-fsmp1a.dtb、stm32mp157a-fsmp1a-rgb070.dtb和stm32mp157a-fsmp1a-mipi050.dtb文件
?
?
stm32mp157a-fsmp1a-rgb070.dtb為rgb屏幕的設備樹文件
stm32mp157a-fsmp1a-mipi050.dtb為mipi屏幕的設備樹文件
編譯內核模塊
linux@ubuntu:$make ARCH=arm modules
linux@ubuntu:$make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install
編譯成功后會在上層目錄生成build目錄其中的install_artifact目錄中存放的即為導出的驅動模塊。
?
1.6 Yocto構建系統
將工作目錄切換到fsmp1a-ST-Yocto源碼目錄下。
linux@ubuntu:$cd ${HOME}/fs-mp1a/ fsmp1a-ST-Yocto
?
導入編譯配置
linux@ubuntu:$DISTRO=openstlinux-weston MACHINE=fsmp1a source layers/meta-farsight/scripts/envsetup.sh
如下界面提示主機的ubuntu版本與期望的版本不同,這里輸入y
?
?
如果是第一次配置,需要同意一些協議,輸入y。。
?
?
之后按空格鍵到協議底部
?
?
輸入y會出現如下界面
?
?
編譯源碼
linux@ubuntu:$bitbake fs-mp1a-weston
注意:在編譯Yocto系統時確保ubuntu主機可以連接互聯網
由于OpenSTLinux涉及到的源碼較多,因此編譯會比較耗時。
編譯完成后所生成的鏡像文件保存在tmp-glibc/deploy/images/fsmp1a/目錄下。
?
這里生成了fs-mp1a開發板所需的燒寫鏡像,包括basic、trusted、optee三種。
basic專有鏡像
u-boot-spl.stm32-stm32mp157a-fsmp1a-basic
u-boot-stm32mp157a-fsmp1a-basic.img
trusted專有鏡像
tf-a-stm32mp157a-fsmp1a-trusted.stm32
u-boot-stm32mp157a-fsmp1a-trusted.stm32
optee專有鏡像
tf-a-stm32mp157a-fsmp1a-optee.stm32
u-boot-stm32mp157a-fsmp1a-optee.stm32
tee-header_v2-stm32mp157a-fsmp1a-optee.stm32
tee-pageable_v2-stm32mp157a-fsmp1a-optee.stm32
tee-pager_v2-stm32mp157a-fsmp1a-optee.stm32
公用鏡像
st-image-bootfs-openstlinux-weston-fsmp1a.ext4
st-image-userfs-openstlinux-weston-fsmp1a.ext4
st-image-vendorfs-openstlinux-weston-fsmp1a.ext4
fs-mp1a-weston-openstlinux-weston-fsmp1a.ext4
配置文件
flashlayout_fs-mp1a-weston文件夾中存放的是燒寫時所使用的配置文件
?
由上圖可以看到配置文件分為sdcard燒寫配置和emmc燒寫配置。
評論
查看更多