導讀:本文將以主流學習芯片為例,梳理以下典型的嵌入式Linux設備的啟動流程,目前比較流行的學習型芯片有S5PV210、S3C2440、AM335x、IMX6ULL、STM32MP157,
目錄
- 0、基礎概念
- 1、S3C2440
- 2、S3C6410
- 3、S5PV210
- 4、AM335x和IMX6ULL
- 4、總結
0、基礎概念
BL0:SOC內置在iROM里的代碼,是芯片廠商事先燒好的代碼,這部分代碼會根據指定的引腳電平決定從什么設備啟動,BL0就是Nand Flash,NorFlash,iNand等設備的復制函式(因為要讀Flash,所以要簡單初始化以下Flash),他的主要作業是把BL1從Flash中拷貝到iRAM或NorFlash上運行,(BL0是SOC出廠前設定的,芯片廠商也不知道板子上將來接的是什么樣的DRAM,因此配置和初始化記憶體和Flash就交給BL1做)
BL1:是開發人員撰寫的代碼,可以是自己寫的裸機程式,也可以是uboot或其他,BL0只做了存盤器的部分初始化,BL1需要關看門狗,設定時鐘,設定例外中斷向量表等作業,
iRAM:Internal SRAM 芯片內置的記憶體,可以直接運行程式,
SOC:System on Chip系統級別芯片,芯片內部集成cpu,記憶體,Flash等控制器,cache等
注:系統剛上電時,記憶體和Flash都沒有被初始化而無法使用,只有iRAM(一般十幾K)可以使用,而正真的代碼在Flash里,Flash(Nor除外)不能直接運行程式,硬體相關介紹參考:ARM嵌入式硬體介紹
1、S3C2440
-
介紹
S3C2440三星公司研發的一款基于ARM920T內核的32位CMOS微控制器,主頻最高400MHZ,結構相對簡單,總體性能比S3C6410差,無iROM,4K iRAM, -
S3C2440記憶體地址表

如圖所示,當外接了NandFlash并設定OM引腳為Nand啟動,由于程式不能在nand上運行程式,所以片內4K記憶體(iRAM)的0地址就是整個記憶體的0地址;當外接了NorFlash并設定OM引腳為Nor啟動時,NorFlash的0地址就是記憶體的0地址,片內RAM基地址為0x4000_0000,
S3C2440上電后從0地址開始運行,如果是nand啟動則從iRAM上開始運行,如果時Nor啟動就從NorFlash上開始運行, -
外接Nand Flash時啟動流程
此時iRAM(片內記憶體)基地址為記憶體0地址,
第一步:Reset復位后,Nand Flash控制器將Nand前4K代碼復制到stepping stone中運行,
第二步:這部分代碼負責配置記憶體和Flash,然后將uboot代碼復制到記憶體中,然后跳轉到記憶體中運行,
第三步:最后uboot啟動Linux內核(OS),然后內核去掛載根檔案系統,進入命令列啟動應用程式,

-
外接Nor Flash時啟動流程
此時NorFlash的0地址為記憶體0地址,
第一步:Reset復位后,程式直接從NorFlash開始運行,初始化記憶體,將uboot拷貝到記憶體中
第二步:跳轉到記憶體中運行,然后啟動內核,
補充:NorFlash參與記憶體統一編址,即通過指標指向NorFlash記憶體地址直接操作Nor,而nand不參與,需要操作nand控制器來讀寫nand,
2、S3C6410
- 介紹
S3C6410是三星推出的基于ARM11架構的應用級SOC,主頻最高667MHz
IROM(0x0800 0000)64M 只用了32K作為BL0, 0地址映射到IROM
IRAM(0x0C00 0000)64M 只用了8K,加載BL1,作為steppingstone - 啟動流程
第一步:Reset復位后,從iROM中讀取BL0執行,BL0將BL1復制到iRAM中運行
第二步:BL1初始化配置記憶體和Flash,然后將BL2(uboot主體代碼)復制到記憶體中,然后跳轉到記憶體中運行(uboot會判斷自己是在iRAM中運行還是記憶體中運行,如果是iRAM則跳轉到記憶體中運行;如果是在記憶體中則直接跳轉到主體代碼運行),可以參考S3C6410啟動流程,
第三步:BL2負責啟動Linux內核(OS),然后內核去掛載根檔案系統,進入命令列啟動應用程式,

3、S5PV210
- 介紹
S5PV210是三星推出的一款適用于智能手機和平板電腦等多媒體設備的應用處理器,采用了ARM Cortex-A8內核,32K一級快取、512K二級快取,作業頻率高達1GHz,支持2D/3D圖形加速,支持全高清、多標準的視頻編碼,
IROM(0XD000 0000) ,大小為64KB,對于0地址處,是啟動區域,也是采用的映射方式,與6410一樣;
IRAM(,0xD002 0000),大小96KB,加載 BL1+BL2,steppingstone; - 啟動流程
第一步:CPU上電后運行BL0,BL0會從相應的外部存盤器去讀取第一部分啟動代碼(BL1,大小為16KB)到iRAM運行,
第二步:BL1負責初始化Flash,然后將BL2讀取到iRAM(剩余的80KB)運行
第三步:BL2負責初始化記憶體,將內核(OS)讀取到記憶體中,然后啟動內核,

- uboot啟動流程
由于uboot一般遠大于96K,實際上uboot并沒有按照上述流程啟動,uboot編譯后會生成uboot-spl.bin(BL1)和uboot.bin,啟動步驟如下:
第一步:上電后BL0開始運行,將uboot-spl.bin(BL1)加載到iRAM中運行
第二步:uboot-spl.bin直接去初始化記憶體和Flash,直接將uboot.bin復制到記憶體中,然后跳轉到記憶體中運行,繞開了BL2,
第三步:uboot.bin運行,啟動內核, - S5PV210二次啟動
BL0加載BL1后會計算BL1的校驗和,如果不通過則啟動失敗,進行第二次啟動,則從第二個設備讀取BL1,如果校驗還是不通過則通過串口啟動,如果失敗則通過USB啟動,如果還是失敗則整個啟動程序失敗,只要有一個成功就執行BL1,

4、AM335x和IMX6ULL
-
介紹
AM335X是TI(德州儀器)推出的基于 ARM Cortex-A8內核的微處理器,最高主頻可以達600M/800M/1GHz,帶NEON協處理器,二級高速快取,24位LCD控制器和觸摸屏控制器,解析度高達2048*2048,
IMX6ULL是NXP(恩智浦)推出的基于ARM Cortex-A7內核的微處理器,最高主頻800MHz, -
啟動程序
- AM335x
啟動流程和S5PV210類似,支持多種設備啟動,SOC內部會保存一份啟動設備的串列,然后按照這個串列的順序去讀取BL1,讀取成功就執行BL1,失敗就去找下一個啟動設備,如果這是最后一個啟動設備,就進入死回圈,BL1就負責初始化Flash和記憶體,然后運行uboot主體代碼,再啟動Linux內核,

- IMX6ULL
IMX6ULL啟動流程和AM335x一樣,第一次啟動失敗就會判斷是不是第一個鏡像,如果是就設定SW引腳,指定下一次啟動為第二個啟動設備,然后復位重啟,
- AM335x

4、總結
這些芯片啟動流程都比較相似,上電后運行BL0,BL0去啟動BL1,BL1初始化記憶體和Flash,然后將代碼復制到記憶體,再跳轉到記憶體中運行,
詳細內容請參考官方資料手冊:芯片手冊下載
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267062.html
標籤:其他
