【正点原子MP157连载】 第六章 TF-A 使用-摘自【正点原子】【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)實驗平臺:正點原子STM32MP157開發板
2)購買鏈接:https://item.taobao.com/item.htm?&id=629270721801
3)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/thread-318813-1-1.html
4)正點原子官方B站:https://space.bilibili.com/394620890
5)正點原子STM32MP157技術交流群:691905614
第六章 TF-A 使用
在上一章已經學會了如何搭建STM32MP157芯片的開發環境,為了方便書寫,本教程把STM32MP157簡稱為MP1。在這個嵌入式的高速發展時代,智能設備在各個領域扮演重要的角色,大量的嵌入式設備使用都是ARM為核心的芯片,為了保證安全ARM推出了Arm Trusted Firmware的可信固件,簡稱TF-A。它是一個開源的軟件,最早是用在Armv8-A,ST也在MP1里面使用到了TF-A。它的作用就是隔離硬件,為硬件提供一個安全環境并且提供安全服務,本章我們先來體驗一下TF-A。
6.1 你好TF-A
時至今日,智能手機、物聯網飛速發展,智能手機里面保存了我們的指紋、Face ID(3D人臉信息)、虹膜、銀行卡密碼等重要信息。而物聯網更是與我們的生活息息相關,比如家用智能攝像頭,一旦安全防線被突破,那么我們的生活就會毫無遮攔的暴露給整個世界。因此智能設備的安全問題就成了半導體行業亟待解決的問題,ARM為此提供了TrustZone解決方案,TrustZone將CPU的工作狀態分為了Secure World(安全世界)和Normal World(非安全世界),涉及到安全相關的內容運行在安全世界,比如指紋、密碼等,其他的操作都在非安全世界運行,比如應用程序。TrustZone是一種硬件解決方案,這里就不深究了(TrustZone相關的安全知識本身就是一門課程)。
6.1.1 系統源碼獲取
與之對應的,我們需要一套軟件來配合TrustZone,TF-A應運而生,TF-A全稱是Arm Trusted Firmware,有些資料也叫做ATF,一般中文資料叫做ARM可信固件。MP1內部集成了TrustZone,因此ST也提供了TF-A相關源碼,TF-A會先初始化DDR等外設,把Uboot從Flash(NAND、NOR FLASH、SD、MMC 等)拷貝到 DDR 中。我們不可能直接去官方網站下載TF-A的源碼,這樣的開發難度太大,半導體廠商都會從TF-A官網下載源碼,然后修改適配自己的芯片,把自家的芯片加進去。我們在實際項目開發中直接使用半導體原廠給提供的TF-A即可。ST官方TF-A、uboot、kernel等源碼下載鏈接為:https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1dev.html,打開以后如圖6.1.1.1所示:
圖6.1.1.1 MP1系統源碼下載
圖6.1.1.1中的STM32MP1Dev就是官方的源碼包,里面包括TF-A,uboot,kernel等源碼,點擊“Get Software”下載整個系統源碼。這里我們已經下載下來并放到了開發板光盤中,路徑為:開發板光盤?1、程序源碼?5、ST官方原版Linux源碼?en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz。
在Ubuntu中創建一個目錄存放源碼,然后將ST官方系統源碼發送到Ubuntu中。這里我在前面創建的“linux”目錄下新建一個名為“atk-mp1”的目錄存放所有源碼,命令如下:
圖6.1.1.2 拷貝官方的SDK
解壓圖6.1.1.2中的壓縮包,命令如下:
tar -xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz
解壓完成以后會得到一個名為“stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24”的文件夾,結果如圖6.1.1.3所示:
圖6.1.1.3 解壓官方的SDK包結果
進入stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi目錄下,里面就是uboot、optee、tf-a、kernel源碼,如圖6.1.4所示:
圖6.1.1.4 系統源碼
圖6.1.1.4中這5個源碼文件夾的含義如表6.1.1.1所示:
文件夾 描述
u-boot-stm32mp-2020.01-r0 uboot源碼,版本號為2020.01
linux-stm32mp-5.4.31-r0 linux源碼,版本號為5.4.31
tf-a-stm32mp-2.2.r1-r0 tf-a源碼,版本號為2.2,我們用到的
tf-a-stm32mp-ssp-2.2.r1-r0 tf-a源碼,ssp全稱為secure secret provisioning, 安全相關的內容,本教程用不到。
optee-os-stm32mp-3.9.0.r1-r0 optee系統源碼,版本為3.9.0,本教程用不到
表6.1.1.1 系統源碼
表6.1.1.1中共有5個源碼,本教程就用到前三個:u-boot-stm32mp-2020.01-r0、linux-stm32mp-5.4.31-r0和tf-a-stm32mp-2.2.r1-r0。也就是TF-A、Uboot和Linux Kernel。傳統的linux學習中不需要TF-A的,只需要uboot和Linux Kernel,但是MP1帶有安全硬件,因此加入了TF-A,加入的TF-A對于linux學習極其不利。為此我們建議過ST修改系統源碼,允許客戶不使用TF-A,就像傳統的嵌入式linux一樣,只用uboot和linux kernel。不過在編寫本教程的時候并未看到ST提供這樣的源碼,所以我們還是要移植TF-A到開發板上的。
首先TF-A并不是ST自己做的,TF-A有自己的官方組織,ST只是將自己的MP1芯片移植到了TF-A上,表6.1.1.1中的tf-a-stm32mp-2.2.r1-r0就是ST自己修改后的TF-A源碼,我們作為MP1芯片的使用者,直接使用ST修改后的TF-A源碼即可,包括uboot、linux kernel都是這樣的。
tf-a-stm32mp-2.2.r1-r0支持ST所有的MP1芯片,也支持各種啟動方式,例如:EMMC、NAND、NOR FLASH 等等。tf-a-stm32mp-2.2.r1-r0里面包含了ST自家所有的MP1評估板,正點原子的STM32MP157開發板參考了ST官方的STM32MP157C-EV1開發板,因此,后續的移植都是以STM32MP157C-EV1開發板為藍本,在此基礎上進行修改。
tf-a-stm32mp-2.2.r1-r0目錄文件如圖6.1.1.5所示:
圖6.1.1.5 tf-a源碼
圖6.1.1.5中一共有5個文件,這五個文件的含義如表6.1.1.2所示:
文件/文件夾 描述
0001-st-update-v2.2-r2.0.0.patch TF-a補丁文件。
Makefile.sdk 編譯TF-A用的Makefile
README.HOW_TO.txt ST官方TF-A的編譯文檔,編譯方法看此文檔即可。
series 存放補丁名字的文件
tf-a-stm32mp-2.2.r1-r0.tar.gz TF-A的源碼壓縮包
表6.1.1.2 tf-a源碼文件含義
6.1.2 TF-A源碼打補丁
圖6.1.1.5中的TF-A源碼還不能直接使用,需要對其打補丁。前面我們說了,ST也是在TF-A官方的源碼上將自己的MP1系列芯片添加進去的,因此必然涉及到對官方TF-A源碼的修改,修改的部分就是“補丁”,補丁文件后綴為.patch,表6.1.1.2中的0001-st-update-v2.2-r2.0.0.patch就是ST為TF-A官方源碼做的補丁文件,補丁文件里面描述了修改源碼中的哪些文件,應該添加或刪除哪些代碼或文件,打完補丁后的TF-A才是我們真正需要的。因此,打補丁需要兩個文件:
①、補丁文件,在此處就是0001-st-update-v2.2-r2.0.0.patch。
②、需要打補丁的源文件,在此處就是tf-a-stm32mp-2.2.r1-r0.tar.gz。
我們需要先解壓tf-a-stm32mp-2.2.r1-r0.tar.gz,如圖如下命令:
tar -vxf tf-a-stm32mp-2.2.r1-r0.tar.gz
解壓完就是會在當前目錄下生成“tf-a-stm32mp-2.2.r1”目錄,如圖6.1.2.1所示:
圖6.1.2.1 解壓TF-A的官方源碼
接下來就是給TF-A源碼打補丁,在解壓好的TF-A的目錄下運行以下命令:
cd tf-a-stm32mp-2.2.r1 //進入TF-A源碼
for p in ls -1 ../*.patch; do patch -p1 < $p; done //打補丁
上面這條命令的意思是把上一層目錄下的所有“.patch”后綴的文件都通過patch命令打補丁到TF-A的源碼目錄,在這里就是將001-st-update-v2.2-r2.0.0.patch這個補丁打入到TF-A源碼里面,過程如圖6.1.2.2所示:
圖6.1.2.2 TF-A的源碼打補丁
由于ST官方源碼目錄太長,為了方便調試,在atk-mp1目錄下創建一個名為“tf-a”的子目錄,然后就打完補丁后的tf-a-stm32mp-2.2.r1-r0目錄下的所有文件都拷貝到tf-a下,命令如下:
cd tf-a-stm32mp-2.2.r1-r0/
cp * /home/zuozhongkai/linux/atk-mp1/tf-a/ -rf
拷貝完成以后的tf-a目錄如圖6.1.2.3所示:
圖6.1.2.3 tf-a目錄
圖6.1.2.3中的tf-a-stm32mp-2.2.r1就是我們后面要使用的,打完補丁后的TF-A源碼。
6.1.3 創建VSCode工程
為了方便閱讀TF-A源碼,我們可以創建一個VSCode工程,然后打開VSCode,點擊:文件->打開文件夾,選中圖6.1.2.3中打完補丁后的tf-a-stm32mp-2.2.r1-r0文件夾,打開以后的VSCode如圖6.1.3.1所示:
圖6.1.3.1 TF-A的VSCode工程
圖6.1.3.1中左側的資源管理器就是TF-A的工程目錄結構。最后我們保存一下工作區,點擊:文件->將工作區另存為…”,打開保存工作區對話框,將工作區保存到 TF-A 源碼根目錄下,設置文件名為“tf-a”,如圖6.1.3.2所示:
圖6.1.3.2 TF-A源碼工作區創建
保存以后就會在TF-A源碼根目錄下多出一個名為“tf-a.code-workspace”的文件,這樣一個完整的VSCode工程就建立起來了。
6.2 編譯和燒錄TF-A
6.1小節我們得到的TF-A源碼是ST提供的,這個TF-A肯定是不能直接在正點原子的STM32MP157開發板上運行的,需要移植和修改。但是在正式移植TF-A之前我們要先體驗一下如何編譯TF-A,并燒寫到正點原子的STM32MP157開發板上,這里我們直接編譯正點原子已經修改好的TF-A。
6.2.1 stm32wrapper4dbg工具安裝
我們在編譯TF-A或者Uboot的時候需要用到stm32wrapper4dbg這個工具,否則編譯會報錯。ST提供了這個工具的源碼,我們需要在Ubuntu下編譯并安裝這個源碼,源碼的下載地址為:https://github.com/STMicroelectronics/stm32wrapper4dbg,這個我們已經下載下來并放到了開發板光盤中,路徑為:開發板光盤?5、開發工具? stm32wrapper4dbg-master.zip。將源碼壓縮包拷貝到Ubuntu下,然后進行解壓,命令如下:
unzip stm32wrapper4dbg-master.zip //解壓
解壓完成以后就會得到一個名為“stm32wrapper4dbg-master”的文件夾,進入到此文件夾里面,然后編譯并安裝,命令如下:
cd stm32wrapper4dbg-master //進入到此文件夾
make //編譯
編譯完成以后就會得到一個名為“stm32wrapper4dbg”的工具,如圖6.2.1.1所示:
圖6.2.1.1 編譯得到的工具
圖6.2.1.1中的“stm32wrapper4dbg”就是我們要的工具,將圖6.2.1.1中編譯出來的stm32wrapper4dbg工具拷貝到Ubuntu的/usr/bin目錄下,命令如下:
sudo cp stm32wrapper4dbg /usr/bin
拷貝完成以后就可以直接在終端中使用stm32wrapper4dbg這個工具了,輸入如下命令查看幫助信息:
stm32wrapper4dbg -s
如果輸出如圖6.2.1.2所示內容就說明stm32wrapper4dbg工具安裝成功:
圖6.2.1.2 stm32wrapper4dbg幫助信息
6.2.2 編譯正點原子官方的TF-A
1、準備正點原子出廠TF-A源碼
首先安裝設備樹編譯相關命令,輸入如下命令:
sudo apt-get install device-tree-compiler
在Ubuntu的atk-mp1目錄下新建一個名為“alientek_tf-a”的子目錄,然后把正點原子修改好TF-A源碼拷貝到alientek_tf-a這個目錄下。正點原子修改好的TF-A源碼已經放到了開發板光盤中,路徑為:開發板光盤?1、程序源碼? 1、正點原子Linux出廠系統源碼? tf-a-stm32mp-2.2.r1-g463d4d8-v1.0.tar.bz2。拷貝完成以后解壓,輸入如下命令:
tar -xvf tf-a-stm32mp-2.2.r1-g463d4d8-v1.0.tar.bz2
解壓完成以后 alientek_tf-a文件夾內容如圖6.2.1.1示:
圖6.2.1.1 解壓好的TF-A
圖6.2.1.1中的‘tf-a-stm32mp-2.2.r1’就是正點原子針對自己的STM32MP157開發板修改過的TF-A源碼,Makefile.sdk是一會編譯TF-A要用到的Makefile。
2、修改Makefile.sdk
首先我們要知道,TF-A是有自己的Makefile文件的,而且真正編譯的時候也是要用TF-A自己的Makefile。Makefile.sdk是ST自己編寫的,也是我們一會編譯TF-A的時候要用到的,Makefile.sdk里面主要定義了一些編譯屬性,比如要使用的交叉編譯器、編譯的一些選項等等,Makefile.sdk最終會調用TF-A內部的Makefile來編譯TF-A。默認情況下Makefile.sdk里面使用的是ST官方的交叉編譯器(arm-ostl-linux-gnueabi-gcc),但是我們本教程用的是通用交叉編譯器arm-none-linux-gnueabihf-gcc,因此我們需要Makefile.sdk,將交叉編譯器改為我們目前所使用的。打開Makefile.sdk,然后找到CROSS_COMPILE,將其改為“arm-none-linux-gnueabihf-”,如圖6.2.1.2所示:
圖6.2.1.2 修改后的Makefile.sdk
3、編譯TF-A
準備工作都就緒以后就可以編譯正點原子出廠TF-A了,進入到圖6.2.1.1中的tf-a-stm32mp-2.2.r1目錄里面,然后運行執行如下命令編譯TF-A:
cd tf-a-stm32mp-2.2.r1/ //進入到正點原子出廠TF-A的源碼目錄
make -f …/Makefile.sdk all //編譯TF-A
‘-f’的意思是重新指定Makefile,在這里就是指定圖6.2.1.1中的Makefile.sdk,編譯成功會出現如圖6.2.1.3所示:
圖6.2.1.3 TF-A編譯成功
編譯完成以后會在上一層目錄,也就是alientek_tf-a下生成一個名為“build”的目錄,如圖6.2.1.4所示:
圖6.2.1.4 build目錄
進入到圖6.2.1.4中的build目錄下,一共有三個子目錄:optee、serialboot和trusted,如圖6.2.1.5所示:
圖6.2.1.5 build子目錄
我們只關注trusted目錄下的文件,此目錄下就保存了MP1所有型號的TF-A固件,包括正點原子開發板所使用的tf-a-stm32mp157d-atk-trusted.stm32,如圖6.2.1.6所示:
圖6.2.1.6 編譯得到的正點原子157開發板所使用的TF-A固件
6.2.3 TF-A燒錄到EMMC
使用STM32CubeProgrammer將TF-A燒寫到開發板里面,STM32CubeProgrammer支持通過UART、USB、STLINK來燒寫系統,本教程全部采用USB燒寫,也就是通過開發板上的USB_OTG口來燒寫系統。
1、準備燒寫的材料
我們在Windows下通過STM32CubeProgrammer來燒寫TF-A,新建一個目錄來存放燒寫鏡像文件,比如我這里創建一個名為“images”的目錄。然后將開發板光盤里面的這兩個文件先拷貝到images目錄下:
①、tf-a-stm32mp157d-atk-serialboot.stm32,由正點原子提供。路徑:開發板光盤?8、系統鏡像?2、出廠系統鏡像? 1、STM32CubeProg燒錄固件包?tf-a? tf-a-stm32mp157d-atk-serialboot.stm32。
②、u-boot.stm32,由正點原子提供。路徑:開發板光盤?8、系統鏡像?2、出廠系統鏡像? 1、STM32CubeProg燒錄固件包?uboot?u-boot.stm32拷貝到images文件夾里。
拷貝完成以后images如圖6.2.3.1所示:
圖6.2.3.1 拷貝文件到images
最后就是前面編譯出來,真正要燒寫的tf-a-stm32mp157d-atk-trusted.stm32,通過FileZilla將Ubuntu里面的tf-a-stm32mp157d-atk-trusted.stm32發送到images目錄下,完成以后結果如圖6.2.3.2所示:
圖6.2.3.2 最終的材料
大家可能會有疑問,tf-a-stm32mp157d-atk-trusted.stm32是我們編譯出來的TF-A,這個沒啥說的,但是,另外兩個是干啥的呢?這個就和STM32CubeProgrammer這個軟件的設計以及燒寫過程有關了。以下內容為作者實際測試研究發現的,ST并沒有給出真正的解釋,可能存在錯誤:
tf-a-stm32mp157d-atk-serialboot.stm32中間有個“serialboot”,也就是串行BOOT,說明是和啟動有關的。此固件用來初始化USB、DDR等外設,DDR初始化了以后就可以運行uboot了,為什么要運行uboot呢?因為uboot里面會初始化EMMC、NAND等外設,而且uboot會提供很強大的EMMC操作指令。也就是說,啟動uboot的目的就是為了操作EMMC、NAND,這樣就可以在uboot里面通過相關的命令將tf-a-stm32mp157d-atk-trusted.stm32寫到EMMC或者NAND里面。這就是需要tf-a-stm32mp157d-atk-serialboot.stm32和u-boot.stm32的原因,這兩個文件存在的目的就是為了將tf-a-stm32mp157d-atk-trusted.stm32燒寫到EMMC、NAND、SD卡里面。
2、準備FlashLayout
圖6.2.3.2中有三個文件,STM32CubeProgrammer如何使用這三個文件,應該放到哪個地方,如果燒寫的話要燒寫到EMMC的哪個地址區域。這些都要通過STM32CubeProgrammer腳本文件來定義,STM32CubeProgrammer腳本文件后綴為.tsv,ST官方也叫做FlashLayout。這里我們直接在正點原子提供的tsv文件基礎上修改,將開發板光盤?8、系統鏡像?2、出廠系統鏡像?1、STM32CubeProg燒錄固件包?flashlayout?atk_emmc-stm32mp157d-atk-qt.tsv拷貝到前面的images前目錄下,然后將其重命名為“tf-a.tsv”,完成以后images目錄如圖6.2.3.3所示:
圖6.2.3.3 最終的images目錄
.tsv是文本格式的,很容易閱讀,關于.tsv語法的詳細講解,請參考:https://wiki.st.com/stm32mpu/wiki/STM32CubeProgrammer_flashlayout。用Notepad++軟件(沒有的話自行安裝,這是個免費軟件,安裝很簡單)打開圖6.2.3.3中的tf-a.tsv,打開以后默認如圖6.2.3.4所示:
圖6.2.3.4 tf-a.tsv內容
tsv對格式有要求,直接看圖6.2.3.4是看不出來啥的,必須要設置一下Notepad++軟件,點擊視圖?顯示符號?顯示空格與制表符, 設置好以后的tf-a.tsv如圖6.2.3.5所示:
圖6.2.3.5 顯示空格與制表符
從圖6.2.3.5中可以看出, tf-a.tsv文件就會發現多了黃色的箭頭,這些箭頭代表是TAB鍵, TAB鍵越多黃色箭頭就越長,如果用空格鍵的話就會顯示‘.’。tsv語法要求只能用TAB鍵,不能用空格!以‘#’開頭為注釋,所以圖6.2.3.5中第一行為注釋。
我們把tf-a.tsv文件內容修改成如圖6.2.3.6所示:
圖6.2.3.6 修改后的tf-a.tsv文件
圖6.2.3.6中一共有5行,第1行為注釋,一共9列,這9列的含義如表6.2.3.1所示:
域 作用
Opt 選項字段,可以設置為“-”、“P”、“D”或“E”
Id 會根據這個id來決定燒寫分區
Name 分區名字
Type 制定燒寫的類型,僅uboot使用。
Device 指定燒寫的設備類型與編號,比如emmc0、emmc1、nand0等,如果opt為‘-’,那么此字段就為none
Offset 分區的起始位置,如果為“boot1”表示EMMC的第一個分區,如果為“boot2”就表示EMMC第二個分區。如果是數字就表示需要偏移的字節數。
Binary 要燒錄的文件
表6.2.3.1 tf-a.tsv的配置解析
接下來詳細講解一下表6.2.3.1中的這7個配置:
①、Opt域
Opt是第一個項,此選項通過‘-’、‘P’、‘D’和‘E’這四個字符定義操作方法,首選的是‘-’和‘P’。
· ‘-’:none,也就是空選項,分區或者設備無需修改,如果Device域為none,那么Opt強制為‘-’。
· ‘P’:向分區或者設備燒寫固件。
STM32CubeProgrammer本質是通過uboot來燒寫系統的,也就是先把uboot加載到板子的DDR里面并運行,然后使用uboot來燒寫系統。uboot會請求需要燒寫的二進制文件,然后將其燒寫到指定的分區或者Falsh設備里面。
針對‘P’選項,還有另外兩個可以搭配使用的小伙伴:
· ‘E’:空分區或設備,表示對應的分區或設備不更新,相關的Id項會被跳過。
· ‘D’:刪除分區或設備。
允許的組合選項如下所示:
· ‘-’:空選型。
· ‘P’:更新分區或設備,也就是向分區或設備燒寫固件。
· ‘PE’:不更新,也就是指定某個分區或者設備不需要燒寫固件,這樣我們就可以單獨只更新tf-a、uboot、kernel或者rootfs。
· ‘PD’:刪除并更新,也可以寫作DP。
· ‘PDE’:刪除并且保持為空,也可以寫作PED/DPE/DEP/EPD/EDP。
②、Id域
STM32CubeProgrammer通過Id域來確定燒寫方法,會通過Id域來識別下一個要燒寫到設備里面的二進制文件:
· ROM或者FSBL:二進制文件要加載到RAM中
· SSBL(uboot):二進制文件要燒寫到Flash中。
FlashLayout支持的Id范圍如表6.2.3.2所示:
范圍 分區
0x01~0x0F 帶有STM32頭部信息的Boot分區,如SSBL、FSBL、其他(TEE或M4固件)
0x10~0xF0 不帶頭部的用戶編程分區,如uiamge、dtb、rootfs、vendorfs、userfs
表6.2.3.2 FlashLayout支持的Id范圍
其中0X01和0X03這兩個ID是給FSBL和SSBL留著的,它們會被加載到RAM中。一些默認的Id含義如表6.2.3.3所示:
Id 分區
0x00 內部使用,用戶不能使用此ID!
0x01 FSBL(第一階段拷貝),ROM代碼使用,會加載到RAM中
0x03 SSBL,FSBL使用,加載到RAM中
0xF1~0xFD 虛擬分區,內部使用
0xF1 命令獲取階段。
0xF2 OTP
0xF3 SSP
0xF4 PMIC NVM
0xFE 操作結束
0xFF 復位
表6.2.3.3 默認Id含義
③、Name域
Name域為一段字符串,也就是目標內存段的名字。
④、Type域
Type域僅僅用于uboot,用來選擇需要更新的Flash區域:
· SD卡或者EMMC設備對應GPT分區。
· 原始的 Flash設備,如NAND、NOR等對應MTD分區。
SD/EMMC和NAND/NOR所支持的Type類型如表6.2.3.4所示:
Type GPT MTD
SD EMMC NAND NOR RAM
Binary × × × × ×
Binary(N) ssbl
FileSystem × × × × dtb
System × × UBI UBI kernel
Rawimage × user data × ×
表6.2.3.4 Type域
注:×表示支持。
正點原子STM32MP157開發板為EMMC類型,所以我們只EMMC下的Type域含義:
· Binary:原始的二進制文件。
· FileSystem:linux文件系統,為ext2/ext4/fat格式。
· System:Linux內核。
⑤、Device域
Device域指定Uboot 設備樹定義的設備和索引(從0開始),不同的設備其設備名字和索引不同:
· mmc+索引:如mmc0、mmc1、mmc2等,對應SD卡或EMMC。比如SD卡和EMMC分別接到MP1的SDMMC1和SDMMC2接口上,那么SD卡和EMMC分別為mmc0和mmc1。
· nor+索引:如nor0,對應 NOR或者QUADSPI Flash。
· mmc+索引:如nand0,對應連接到FMC總線上的并行NAND Flash。
· spi-nand+索引:如spi-nand0,對應連接到QSPI上的串行NAND Flash。
· none:RAM,也就是將固件加載到RAM里面,僅允許啟動階段使用,而且Type域要為Binary,Offset域要為0,Opt域為‘-’。
· ram+索引:如ram0,燒寫服務講固件加載到RAM中運行。
⑥、Offset域
Offset就是偏移,支持的值如下:
· boot1:EMMC的第一個啟動區域分區。
· boot2:EMMC的第二個啟動區域分區。
· 數字:具體的偏移值,單位為字節。
⑦、Binary域
STM32CubeProgrammer軟件要使用的二進制文件。
關于STM32CubeProgrammer的FlashLayout文件語法就講解到這里,接下來就是將TF-A燒寫到開發板的EMMC里面。
3、通過USB燒寫TF-A
首先設置開發板撥碼開關,設置為000,也就是從USB啟動,然后復位開發板!
一切準備就緒,現在可以通過STM32CubeProgrammer將TF-A源碼燒寫到EMMC里面了,首先通過USB Type-C線將開發板的USB_OTG和USB_TTL連接到電腦上,如圖6.2.3.7所示:
圖6.2.3.7 USB串口與USB OTG連接
按照圖6.2.3.7將板子的USB串口與USB OTG連接到電腦以后還要檢查一下連接是否成功,打開電腦的設備管理器,查看CH340和DFU模式是否存在,如圖6.2.3.8所示:
圖6.2.3.8 USB串口與USB OTG
連接沒問題的話就可以使用STM32CubeProgrammer來燒寫TF-A了,打開STM32CubeProgrammer,選擇USB連接方式,Port選擇USB1,如圖6.2.3.9所示:
圖6.2.3.9 USB連接設置
USB設置好以后點擊圖6.2.3.9右上角的“Connect”來連接開發板,連接成功以后左下角的log區域就會輸出一些信息,右側中間的數據區域也會顯示開發板默認的分區情況,右下角會顯示目標板信息,如圖6.2.3.10所示:
圖6.2.3.10 軟件連接信息
STM32CubeProgrammer要使用FlashLayout文件來燒寫系統,也就是前面我們創建的tf-a.tsv。點擊圖6.2.3.10中的“Open File”,打開tf-a.tsv,打開以后如圖6.2.3.11所示:
圖6.2.3.11 加載tf-a.tsv文件
注意,如果大家沒有看到圖6.2.3.11中的“Browse”和“Download”這兩個按鈕的話,請把STM32CubeProgrammer界面托大一點,尤其是左右托大,因為軟件默認界面會把這兩個按鈕擋住!
一切準備就緒以后就可以點擊圖6.2.3.11中的“Download”按鈕開始下載,下方的log區域就會顯示燒寫過程,燒寫完成以后就會有如圖6.2.3.12所示提示:
圖6.2.3.12 燒寫成功
6.2.4 TF-A的運行
我們自己編譯的TF-A已經燒寫到了開發板中,接下來就是測試一下看能不能運行,打開 MobaXterm軟件,設置好與開發板連接的串口,波特率選擇115200。
設置開發板撥碼開關為010,也就是從EMMC啟動,然后復位開發板!
注意,由于我們開發板默認已經燒寫了整套Linux系統,所以直接啟動的話會啟動整個系統,包括我們剛剛燒寫的自己編譯的TF-A,原有的uboot、Linux系統等。TF-A是最先啟動的,也就是最前的就是我們自己編譯的TF-A,如圖6.2.4.1所示:
圖6.2.4.1 TF-A啟動log信息
TF-A啟動的時候會打印出編譯時間,我們可以通過編譯時間來判斷是否為我們自己編譯的TF-A。比如圖6.2.4.1中TF-A的編譯時間為2020年11月11號10:53:02,這個時間正是筆者寫教程編譯的時間,說明目前正在運行的TF-A就是筆者自行編譯的正點原子出廠TF-A,也就是tf-a-stm32mp157d-atk-trusted.stm32。
總結
以上是生活随笔為你收集整理的【正点原子MP157连载】 第六章 TF-A 使用-摘自【正点原子】【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张静君在哭
- 下一篇: 美团登录获取cookie