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