溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

發(fā)布時間:2021-10-22 10:39:12 來源:億速云 閱讀:264 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這期內(nèi)容當中小編將會給大家?guī)碛嘘P嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

i.MX6UL 芯片上電過程分析

        嵌入式Linux系統(tǒng)移植開發(fā)-基于Yocto構建嵌入式u-boot,內(nèi)核,文件系統(tǒng)

        在分析i.MX6UL 的u-boot啟動過程之前,先來分析一下i.MX6UL芯片一上電的時候,執(zhí)行了哪些操作,進行了哪些處理。這個上電過程,通常是指處理器芯片從上電開始,到執(zhí)行到BootLoader的匯編入口函數(shù)(如u-boot的入口函數(shù)是_start函數(shù))之前的過程。

        很多初學者或者一部分單片機工程師都會認為,芯片一上電的時候,首先執(zhí)行的程序是類似u-boot之類的BootLoader,或者是單片機程序里面類似于xxxx_start_up.S的啟動文件,更有很多單片機工程師認為,芯片一上電就去執(zhí)行main()函數(shù)。其實,大部分嵌入式處理器芯片一上電的時候,首先執(zhí)行的既不是BootLoader,也不是執(zhí)行類似于xxxx_start_up.S的啟動文件。而是執(zhí)行一段開發(fā)者看不見摸不著的程序,通常把這段程序稱為BootROM。這段程序在嵌入式處理器芯片生產(chǎn)設計的時候就被芯片設計廠家固化在芯片里面,開發(fā)者作為使用芯片的角色,不需要獲得BootROM的源碼,也不需要對BootROM源碼進行改寫。但作為開發(fā)工程師,了解一下BootROM的工作原理,可以對芯片上電的啟動過程,有更深刻的認識。

        先來看看i.MX6UL的芯片上電流程,如下圖所示:

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

(1)芯片上電復位啟動后,首先檢測CPU_ID,然后再檢測復位的類型。

(2)復位啟動類型主要分兩種:正常啟動模式和從低功耗啟動模式。

(3)如果從低功耗模式啟動,芯片會先檢測是否允許喚醒,如果否,芯片會清除低功耗狀態(tài),然后復位。如果是,則進行喚醒處理,并跳轉到有效鏡像執(zhí)行。

(4)如果是正常啟動模式,則會根據(jù)eFUSES或GPIO引腳狀態(tài),決定啟動的方式,啟動方式分別有三種:從eFUSES啟動、進入Serial Downloader啟動、進入Internal Boot啟動。后面會講解這三種啟動方式。

        (4.1)如果是進入Serial Downloader啟動,則會通過USB的方式下載和校驗鏡像。

        (4.2)eFUSES啟動和Internal Boot啟動,其實是類似的,區(qū)別在于,eFUSES的啟動方式不能通過GPIO引腳進行改寫。而Internal Boot啟動可以根據(jù)GPIO引腳來改變不同的啟動方式。啟動方式還需要配合BT_FUSE_SEL來進行判斷。

        (4.3)如果通過GPIO引腳選擇了Internal Boot啟動,則會從外部設備加載啟動鏡像,如果鏡像加載成功,則會執(zhí)行加載后的啟動鏡像(通常是u-boot)。如果加載鏡像失敗,那就跳轉到Serial Downloader啟動,通過USB的方式下載啟動鏡像。

        總的來說,i.MX6UL這款芯片的BootROM的主要功能是,根據(jù)內(nèi)部eFUSES或者外部GPIO的狀態(tài),來判斷芯片從哪里(可以是SD卡,NandFlash,eMMC等)加載啟動鏡像,然后再從啟動鏡像獲取芯片的初始化方式(啟動鏡像u-boot.imx就是u-boot.bin + header數(shù)據(jù)的集合,這個header數(shù)據(jù)就是提供給芯片的BootROM使用的),最后通過絕對地址,跳轉到啟動鏡像那里,執(zhí)行第一句用戶程序指令(通常是u-boot里面的_start函數(shù),通過u-boot.lds鏈接腳本,可以看到u-boot的第一個函數(shù)入口,接下來才是u-boot的啟動過程)。

        對于低功耗模式的啟動,本章不作分析,本章重在分析Normal Boot的啟動方式,即正常模式啟動,在Normal Boot的啟動模式下,主要有三種啟動方式:從eFUSES啟動、進入Serial Downloader啟動、進入Internal Boot啟動。這三種啟動方式主要是通過BOOT_MODE[1:0]寄存器以及BT_FUSE_SEL這個eFUSES標志共同決定的。BOOT_MODE[1:0]和BT_FUSE_SEL的真值表如下所示:

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

        對于調(diào)試環(huán)境,通常使用BOOT_MODE [1:0] = 10 和 BT_FUSE_SEL = 1來進行配置,方便開發(fā)人員進行調(diào)試。對于生產(chǎn)環(huán)境,通常使用BOOT_MODE [1:0] = 00 和 BT_FUSE_SEL = 1來進行配置,芯片不再允許調(diào)試,每次上電都從boot_device啟動。(這里的boot_device是指NandFlash,SD卡,eMMC之類的存有啟動鏡像的設備)芯片有BOOT_MODE0、BOOT_MODE1、POR_B三個外部引腳,BOOT_MODE0和BOOT_MODE1這兩個引腳的狀態(tài)會在POR_B引腳的上升沿被捕獲,然后這兩個引腳的狀態(tài)會被記錄在SRC_SBMR2寄存器的BMOD[1:0]這兩個位,后續(xù)這兩個引腳的狀態(tài)不再影響芯片內(nèi)部的BOOT_MODE寄存器。

        “從eFUSES啟動”和“進入Internal Boot啟動”這兩種啟動方式比較類似,差別就在于,Internal Boot啟動可以通過某些GPIO來覆寫eFUSES的值,所以,在使用開發(fā)板調(diào)試的時候,Internal Boot啟動用得比較多。針對作者編寫本章節(jié)時使用的開發(fā)板是TQ-i.MX6UL,這款開發(fā)板的核心板是使用256MB NandFlash的,開發(fā)板也支持SD卡啟動和燒錄系統(tǒng)鏡像,因此,后面來分析一下,i.MX6UL使用NandFlash作為boot_device的啟動過程。

        i.MX6UL芯片通過NandFlash啟動的時候,因為BootRom還不知道具體的NandFlash型號,所以BootRom會以一個通用但不是最優(yōu)的通信時序跟NandFlash通信,從NandFlash里面讀取一個啟動控制塊(Boot Control Blocks,簡稱BCB),這個啟動控制塊里面包含了兩個數(shù)據(jù)結構:固件控制塊(Firmware Configuration Block,簡稱FCB)和壞塊表(Discovered Bad Block Table,簡稱DBBT)。

        FCB固件控制塊受NandFlash的硬件ECC保護,確保FCB的正確性。在芯片一上電的時候,BootRom會讀取NandFlash的第一個塊里面的第一頁共2112字節(jié)的內(nèi)容(2048 字節(jié)的頁大小 + 64字節(jié)的備用空間)。如果這2112字節(jié)里面不是有效的FCB數(shù)據(jù),則會繼續(xù)跳轉查找下一個FCB數(shù)據(jù),如果達到最大的查找次數(shù)還沒有找到有效的FCB,則BootRom里面的NandFlash驅動會回應一個錯誤,并讓芯片進入Serial Downloader模式進行啟動。

        如果查找到有效的FCB,由于FCB里面包含了DBBT的地址頁信息,BootRom則會根據(jù)FCB里面的地址,再去查找DBBT。如果在FCB里面關于DBBT的查找區(qū)域是0,則表明這個NandFlash沒有壞塊存在。

        關于FCB固件控制塊和DBBT壞塊表的數(shù)據(jù)結構。FCB固件控制塊的數(shù)據(jù)結構,如下圖所示:

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

        DBBT壞塊表的數(shù)據(jù)結構里面,包含了以下信息:DBBT的指紋信息,版本號,DBBT壞塊表的大小,壞塊的數(shù)量,壞塊的編號,等等。

        總結一下:FCB和DBBT位于NandFlash最開始的位置,芯片上電時由BootROM去讀取這兩個數(shù)據(jù)結構的內(nèi)容,F(xiàn)CB包含了NandFlash的最佳工作時序,也包含了第一個啟動固件的起始頁地址(這里指的是u-boot.imx的存放頁地址)。BootRom會通過NandFlash最佳的工作時序去初始化NandFlash,找出u-boot.imx存放在哪個頁位置,加載u-boot.imx后開始解析u-boot.imx的Header頭部數(shù)據(jù)。

        我們下載到開發(fā)板的u-boot文件,全稱是“u-boot.imx”,這個文件是u-boot.bin和一些Header頭部數(shù)據(jù)的集合。這些Header頭部數(shù)據(jù)是在編譯u-boot的時候,由mkimage工具調(diào)用格式類型為imximage的解釋器來生成的。mkimage把這些頭部數(shù)據(jù)和u-boot.bin一起打包為u-boot.imx格式文件。這個u-boot.imx文件,在手冊里面被稱作為Program Image。

        Program Image(即u-boot.imx)包含以下幾方面的內(nèi)容:

(1)Image Vector Table —— 鏡像向量表,簡稱IVT,位于固定地址的指針列表,ROM檢查該列表以確定程序映像的其他組件所在的位置。

(2)Boot Data —— 表示程序鏡像的位置,鏡像大小,以及插件標志。

(3)Device Configuration Data —— 表示芯片IC的初始化數(shù)據(jù)。

(4)User Code and Data —— 用戶代碼和數(shù)據(jù)

        Program Image(即u-boot.imx)的內(nèi)存圖如下圖所示:

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

        對于TQ-i.MX6UL開發(fā)板,其配套的u-boot.imx文件的16進制數(shù)據(jù)以及分析,如下圖所示:

嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程

        i.MX6UL使用NandFlash作為啟動設備,上電過程總結如下:

        芯片內(nèi)置的BootRom程序會根據(jù)外部BOOT_MODE[1:0]引腳的狀態(tài),決定芯片是通過內(nèi)部啟動模式,從NandFlash進行芯片啟動,啟動時所需的FCB和DBBT都存放在NandFlash最開始的4k空間里,通過讀取FCB和DBBT,可以獲取NandFlash的最佳工作時序,壞塊表情況,以及u-boot.imx在NandFlash的存放位置。u-boot.imx其實就是u-boot.bin加上Header數(shù)據(jù)的集合。當知道u-boot.imx的存放位置后,隨即把u-boot.imx的前2k字節(jié)復制到芯片的內(nèi)部RAM進行解析,不能復制到外部RAM,因為此時外部RAM還沒有初始化。這2K字節(jié)就是IVT信息,BootData信息,DCD信息。其中,IVT信息里面包含了u-boot.bin的鏈接地址,可以通過這個地址讓芯片跳轉到u-boot程序,并開始執(zhí)行u-boot的第一條程序語句。

上述就是小編為大家分享的嵌入式Linux系統(tǒng)移植開發(fā)中i.MX6UL芯片上電的分析過程了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI