1.為什么NAND FLASH不能直接運(yùn)行程序? ? NAND FLASH本身是連接到了控制器上而不是系統(tǒng)總線上,。CPU運(yùn)行機(jī)制為:CPU啟動(dòng)后是要取指令執(zhí)行的,如果是SROM,、NOR FLASH 等之類的,,CPU 通過地址線發(fā)個(gè)地址就可以取得指令并執(zhí)行,NAND FLASH不行,,因?yàn)镹AND FLASH 是管腳復(fù)用,,它有自己的一套時(shí)序,這樣CPU無法取得可以執(zhí)行的代碼,,也就不能初始化系統(tǒng)了,。 ? ? NAND FLASH是順序存取設(shè)備,不能夠被隨機(jī)訪問,,程序就不能夠分支或跳轉(zhuǎn),,這樣你如何去設(shè)計(jì)程序。 ? ? U-BOOT 支持ARM,、 PowerPC等多種架構(gòu)的處理器,,也支持Linux、NetBSD和VxWorks等多種操作系統(tǒng),,主要用來開發(fā)嵌入式系統(tǒng)初始化代碼 bootloader,。bootloader是芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,完成由硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過渡,,為運(yùn)行操作系統(tǒng)提供基本的運(yùn)行環(huán)境,,如初始化CPU、堆棧,、初始化存儲(chǔ)器系統(tǒng)等,,其功能類似于PC機(jī)的BIOS,。 2.為什么s3c2440可以從NAND FLASH啟動(dòng)? ? 椐了解 NOR FLASH 是容量小,速度快,,穩(wěn)定性好,,適合做程序存儲(chǔ)器。 ? ? NAND FLASH 總?cè)萘看?,適合做數(shù)據(jù)存儲(chǔ)器是不能從NAND FLASH啟動(dòng)的,,NAND FLASH是的讀寫時(shí)序是不能直接有ARM硬件產(chǎn)生的,要讀寫NAND FLASH是要通過程序來實(shí)現(xiàn)的,,很明顯能看出來的就是NAND FLASH只有8個(gè)數(shù)據(jù),、地址復(fù)用的數(shù)據(jù)地址接口。2410/2440可以直接從NAND FLASH啟動(dòng)的,,因?yàn)樗袾AND前面的4K映射到了RAM的空間 2.1 Flash種類? ? NOR FLASH地址線和數(shù)據(jù)線分開,,來了地址和控制信號(hào),數(shù)據(jù)就出來,。 ? ? NAND Flash地址線和數(shù)據(jù)線在一起,,需要用程序來控制,才能出數(shù)據(jù),。 ? ? 通俗的說,,就是光給地址不行,要先命令,,再給地址,,才能讀到NAND的數(shù)據(jù)。而且都是在一個(gè)總線完成的,。 ? ? 結(jié)論是:ARM無法從NAND直接啟動(dòng),。除非裝載完程序,才能使用NAND Flash. ? ? 三星的2410可以從NAND FLASH啟動(dòng)程序,它會(huì)把第一塊的前4KB復(fù)制到內(nèi)部SRAM中然后從SRAM執(zhí)行,也就是說,你需要編寫一個(gè)長(zhǎng)度小于4K的引導(dǎo)程序,作用是將主程序拷貝到SDRAM中運(yùn)行(NAND FLASH地址不是線性的,程序不能直接運(yùn)行,必須拷貝到線性RAM中) 3.NAND啟動(dòng)和NOR啟動(dòng):? ? 需要檢測(cè)硬件啟動(dòng)方式,,啟動(dòng)方式是由硬件OM0管腳決定的,軟件無法檢測(cè)硬件電平狀態(tài),,但可以根據(jù)CPU的啟動(dòng)特性來檢測(cè),。 3.1 NAND啟動(dòng):? ? 如果配置為NAND FLASH啟動(dòng)(啟動(dòng)模式選擇開關(guān)拔到nand端,此時(shí)OM0管腳拉低)S3C2440的NAND控制器會(huì)自動(dòng)把NAND FLASH中的前4K代碼數(shù)據(jù)搬到內(nèi)部SRAM中(地址為0x40000000),同時(shí)還把這塊SRAM地址映射到了0x00000000地址,。CPU從0x00000000位置開始運(yùn)行程序,。 【從NAND FLASH啟動(dòng)CPU時(shí),CPU會(huì)通過內(nèi)部的硬件將NAND FLASH開始的4KB數(shù)據(jù)復(fù)制到稱為“Steppingstone”的4KB的內(nèi)部RAM中(起始地址為0),,然后跳到地址0開始執(zhí)行】 3.2 NOR啟動(dòng):? ? 如果配置為NOR FLASH啟動(dòng)(啟動(dòng)模式選擇開關(guān)拔到nor端,,此時(shí)OM0管腳拉高),0x00000000就是NOR FLASH實(shí)際的起始地址,,NOR FLASH中的程序就從這里開始運(yùn)行,,不涉及到數(shù)據(jù)拷貝和地址映射,。 3.3 總結(jié):? ? NAND啟動(dòng)時(shí),地址0x00000000為內(nèi)部SRAM映射的地址,; ? ? NOR啟動(dòng)時(shí),,地址0x00000000為NOR FLASH的實(shí)際起始地址。向NOR FLASH中寫數(shù)據(jù)需要特定的命令時(shí)序,,而向內(nèi)存中寫數(shù)據(jù)可以直接向內(nèi)存地址賦值,。 ? ? 對(duì)于S3C2440處理器 M[1:0]選擇01 或 10時(shí):norflash基地址為0x00000000 ,SRAM頂端地址0x40000FFF,。上電后處理器直接從0x00000000處取出指令,,arm處理器的SP(堆棧指針寄存器)指向0x40000FFF。 ? ? OM[1:0]選擇00,,S3C2440會(huì)啟用內(nèi)部的SRAM緩沖器會(huì)將nandflash中的前4KB大小的程序自動(dòng)拷貝到BootSRAM中,。BootSRAM基地址0x00000000,頂端0x00000FFF,。上電后,,arm處理器從0x00000000取出第一條指令,arm處理器的SP(堆棧指針寄存器)指向0x00000FFF,。 4.從Nand Flash啟動(dòng)U-BOOT的基本原理4.1 前4K問題? ? 如果S3C2410被配置成從Nand Flash啟動(dòng)(配置由硬件工程師在電路板設(shè)置), S3C2410的Nand Flash控制器有一個(gè)特殊的功能,在S3C2410上電后,Nand Flash控制器會(huì)自動(dòng)的把Nand Flash上的前4K數(shù)據(jù)搬移到4K內(nèi)部RAM中,并把0x00000000設(shè)置內(nèi)部RAM的起始地址,CPU從內(nèi)部RAM的0x00000000位置開始啟動(dòng),。這個(gè)過程不需要程序干涉。程序員需要完成的工作,是把最核心的啟動(dòng)程序放在Nand Flash的前4K中,。 4.2 程序大于4K時(shí)怎么辦?? ? 那么當(dāng)程序大于 4k 的時(shí)候,,當(dāng)我們以 nand flash啟動(dòng)后,,前面的4Kb 被拷貝到 片內(nèi)RAM中去執(zhí)行(自動(dòng)完成)。我們?cè)谶@前4K的程序中初始化SDRAM(SDRAM 使用前需要初始化) ,,然后將剩下的程序拷貝到 SDRAM中(不是只有4kb 被拷貝到片內(nèi)RAM中執(zhí)行了嘛)然后跳轉(zhuǎn)到 SDRAM中去執(zhí)行剩下的程序,。 ? ? 那么也就是說 通常當(dāng)程序大于 4kb的 時(shí)候,我們就需要把程序拷貝到SDRAM中去運(yùn)行,。(程序小于4KB 那么也就可以不用拷貝了,,以nand flash方式 啟動(dòng)后,程序全被拷貝到 片內(nèi)4kb的 RAM中去運(yùn)行,。) ? ? 那么,,既然程序大于4kb的時(shí)候需要從nand flash中拷貝到 SDRAM中去運(yùn)行。自然可以想到 燒到nand flash中的程序前面一部分代碼應(yīng)該 是初始化SDRAM(程序最終需要拷貝到SDRAM中去運(yùn)行)和 將NAND flash中的剩余的程序拷貝到SDRAM中去(全考過去也行,,方便點(diǎn)),,然后跳轉(zhuǎn)到SDRAM中執(zhí)行。 4.2 啟動(dòng)程序的安排? ? 由于Nand Flash控制器從Nand Flash中搬移到內(nèi)部RAM的代碼是有限的,所以在啟動(dòng)代碼的前4K里,我們必須完成S3C2410的核心配置以及把啟動(dòng)代碼(U-BOOT)剩余部分搬到RAM中運(yùn)行,。 ? ? Nand Flash的命令,、地址,、數(shù)據(jù)都通過I/O口發(fā)送,管腳復(fù)用,,這樣做的好處是,,可以明顯減少NAND FLASH的管腳數(shù)目,將來如果設(shè)計(jì)者想將NAND FLASH更換為更高密度,、更大容量的,,也不必改動(dòng)電路板。 5.為什么NOR啟動(dòng)要將sp設(shè)置為0x40000000+4096
? ? 因?yàn)閷?duì)于啟動(dòng)文件.S來說,,4K的空間是足夠存放,代碼段,、BSS......和堆棧段了,,因?yàn)槎褩5腟P是從高地址往低地址移動(dòng)的,所以要將堆棧的起始地址放在堆棧段的高地址,。 ? ? 你也可以不用設(shè)置成4096,,但要保證堆棧的長(zhǎng)度不能和下面其他段重疊,若重疊,,就會(huì)出BUG,,保險(xiǎn)值是4096(4K,見上圖),因?yàn)镾RAM就是4K設(shè)計(jì)的,。 ??大家的鼓勵(lì)是我繼續(xù)創(chuàng)作的動(dòng)力,,如果覺得寫的不錯(cuò),歡迎關(guān)注,,點(diǎn)贊,,收藏,轉(zhuǎn)發(fā),,謝謝,! |
|