STM32MP157 Linux系統(tǒng)移植開發(fā)篇8:Linux內(nèi)核配置方法及編譯
本文章為《STM32MP157 Linux系統(tǒng)移植開發(fā)篇》系列中的一篇,筆者使用的開發(fā)平臺為華清遠見FS-MP1A開發(fā)板(STM32MP157開發(fā)板)。stm32mp157是ARM雙核,2個A7核,1個M4核,A7核上可以跑Linux操作系統(tǒng),M4核上可以跑FreeRTOS、RT-Thread等實時操作系統(tǒng),STM32MP157開發(fā)板所以既可以學嵌入式linux,也可以學stm32單片機。
針對FS-MP1A開發(fā)板,除了Linux系統(tǒng)移植篇外,還包括其他多系列教程,包括Cortex-A7開發(fā)篇、Cortex-M4開發(fā)篇、擴展板驅(qū)動移植篇、Linux應用開發(fā)篇、FreeRTOS系統(tǒng)移植篇、Linux驅(qū)動開發(fā)篇、硬件設計篇、人工智能機器視覺篇、Qt應用編程篇、Qt綜合項目實戰(zhàn)篇等。歡迎關(guān)注,更多stm32mp157開發(fā)教程及視頻,可加技術(shù)交流Q群459754978,感謝關(guān)注。
關(guān)于FS-MP1A開發(fā)板:
手機淘寶分享碼:復制本行文字打開手淘?T4FPXn3YYJ2?
鏈接:https://item.taobao.com/item.htm?id=622457259672
Linux內(nèi)核配置及編譯
解壓內(nèi)核
建立源碼目錄
linux@ubuntu:$ cd ~/FS-MP1A/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0

該目錄下以patch結(jié)尾的文件為ST官方提供的補丁文件,linux-5.4.31.tar.xz為標準linux源碼包。
解壓標準內(nèi)核源碼包
linux@ubuntu:$ tar -xvf linux-5.4.31.tar.xz

進入內(nèi)核源碼目錄下
linux@ubuntu:$ cd linux-5.4.31

添加STMicroelectronics官方補丁
解壓linux內(nèi)核源碼后得到的是Linux社區(qū)的標準內(nèi)核源碼,接下來需要將ST官方提供的源碼補丁添加到標準內(nèi)核中。
linux@ubuntu:$ for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
該命令會將上層目錄下所有的patch補丁文件應用到當前的內(nèi)核中。
生成標準板配置文件
生成multi_v7_defconfig默認配置
linux@ubuntu:$ make ARCH=arm multi_v7_defconfig "fragment*.config"
在默認multi_v7_defconfig配置中加入ST官方提供的fragment config
linux@ubuntu:$ for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
linux@ubuntu:$ yes '' | make ARCH=arm oldconfig
生成自己的默認配置文件
linux@ubuntu:$ cp .config arch/arm/configs/stm32_fsmp1a_defconfig
取消git中的SHA1
linux@ubuntu:$ echo "" > .scmversion
配置內(nèi)核
導入交叉編譯工具鏈(如果還未安裝SDK可參考《SDK工具鏈安裝》章節(jié)進行安裝)
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
驗證開發(fā)工具是否安裝正確,顯示版本信息如下圖所示。
linux@ubuntu:$ $CC --version

在編譯前如果需要編譯額外的功能或者驅(qū)動,可以使用meunconfig來對內(nèi)核進行配置。
linux@ubuntu:$ make menuconfig

可以在如上菜單中對內(nèi)核進行詳細的配置。
編譯內(nèi)核
linux@ubuntu:$ make -j4 ARCH=arm uImage vmlinux LOADADDR=0xC2000040

編譯后在內(nèi)核源碼目錄下,能夠在生成一個vmlinux文件,該文件是沒有經(jīng)過壓縮的內(nèi)核鏡像,這個鏡像導出了所有的內(nèi)核符號可以用作仿真調(diào)試。

此外在arch/arm/boot目錄下還生成了一個uImage文件,這就是經(jīng)過壓縮的內(nèi)核鏡像??梢杂米飨到y(tǒng)啟動。
編譯內(nèi)核模塊
linux@ubuntu:$ make ARCH=arm modules
該操作會將內(nèi)核中配置為模塊的源碼進行編譯,最終得到ko文件。

生成設備樹
以參考板DK1設備樹文件stm32mp15xx-dkx.dtsi和stm32mp157a-dk1.dts為參考,增加stm32mp15xx-fsmp1x.dtsi和stm32mp157a-fsmp1a.dts:
對stm32mp15xx-fsmp1x.dtsi內(nèi)容進行整理,去掉沒有被使用的節(jié)點信息和明顯與FS-MP1A的硬件沒有關(guān)系的節(jié)點信息。下文內(nèi)容是刪掉了所有暫不使用的節(jié)點信息,整理出一個相對簡單的設備樹文件,確保內(nèi)核可以正常啟動。后續(xù)各個外設移植時會陸續(xù)增加文件的相關(guān)內(nèi)容。
在arch/arm/boot/dts/ 目錄下新建
stm32mp15xx-fsmp1x.dtsi:







將編譯好的設備樹文件與內(nèi)核的uImage文件,復制到ubuntu主機的/tftpboot文件夾下,當使用tftp方式下載內(nèi)核與設備樹文件時會用到。
linux@ubuntu:$?cp arch/arm/boot/uImage /tftpboot/
linux@ubuntu:$ cp arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb /tftpboot/
[if !supportLists]1.1?[endif]配置tftp
在linux系統(tǒng)移植中,我們使用tftp下載的方式來驗證結(jié)果。使用tftp下載需要構(gòu)建pxelinux相關(guān)的目錄。此部分可參考《通過tftp方式下載linux內(nèi)核及設備樹》章節(jié)進行搭建。
如果環(huán)境搭建已經(jīng)搭建完成,需要將ubuntu主機中的/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17文件內(nèi)容,暫時替換為如下內(nèi)容,在后續(xù)的移植過程中會根據(jù)不同的需求進行修改。
?/tftpboot/pxelinux.cfg/01-00-80-e1-42-60-17?
12345678?#?Generic?Distro?Configuration?file?generated?by?OpenEmbeddedmenu?title?Select?the?boot?modeTIMEOUT?20DEFAULT?stm32mp157a-fsmp1a-emmcLABEL?stm32mp157a-fsmp1a-emmc????????KERNEL?/uImage????????FDT?/stm32mp157a-fsmp1a.dtb????????APPEND?root=/dev/mmcblk1p4?rootwait?rw?console=ttySTM0,115200
修改01-00-80-e1-42-60-17文件后,繼續(xù)按照《通過tftp方式下載linux內(nèi)核及設備樹》章節(jié)中的描述進行啟動。
由于目前還未對源碼進行任何修改,在內(nèi)核啟動過程中會停留在如下地方。

后續(xù)會通過對系統(tǒng)源碼的修改,逐漸完成整個系統(tǒng)的啟動和對外圍設備的驅(qū)動。