1.為什么NAND FLASH不能直接運(yùn)行程序? ? NAND FLASH本身是連接到了控制器上而不是系統(tǒng)總線上。CPU運(yùn)行機(jī)制為:CPU啟動(dòng)后是要取指令執(zhí)行的,如果是SROM、NOR FLASH 等之類的,CPU 通過(guò)地址線發(fā)個(gè)地址就可以取得指令并執(zhí)行,NAND FLASH不行,因?yàn)镹AND FLASH 是管腳復(fù)用,它有自己的一套時(shí)序,這樣CPU無(wú)法取得可以執(zhí)行的代碼,也就不能初始化系統(tǒng)了。 ? ? NAND FLASH是順序存取設(shè)備,不能夠被隨機(jī)訪問(wèn),程序就不能夠分支或跳轉(zhuǎn),這樣你如何去設(shè)計(jì)程序。 ? ? U-BOOT 支持ARM、 PowerPC等多種架構(gòu)的處理器,也支持Linux、NetBSD和VxWorks等多種操作系統(tǒng),主要用來(lái)開發(fā)嵌入式系統(tǒng)初始化代碼 bootloader。bootloader是芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,完成由硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過(guò)渡,為運(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是要通過(guò)程序來(lái)實(shí)現(xiàn)的,很明顯能看出來(lái)的就是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ù)線分開,來(lái)了地址和控制信號(hào),數(shù)據(jù)就出來(lái)。 ? ? NAND Flash地址線和數(shù)據(jù)線在一起,需要用程序來(lái)控制,才能出數(shù)據(jù)。 ? ? 通俗的說(shuō),就是光給地址不行,要先命令,再給地址,才能讀到NAND的數(shù)據(jù)。而且都是在一個(gè)總線完成的。 ? ? 結(jié)論是:ARM無(wú)法從NAND直接啟動(dòng)。除非裝載完程序,才能使用NAND Flash. ? ? 三星的2410可以從NAND FLASH啟動(dòng)程序,它會(huì)把第一塊的前4KB復(fù)制到內(nèi)部SRAM中然后從SRAM執(zhí)行,也就是說(shuō),你需要編寫一個(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管腳決定的,軟件無(wú)法檢測(cè)硬件電平狀態(tài),但可以根據(jù)CPU的啟動(dòng)特性來(lái)檢測(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ì)通過(guò)內(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問(wèn)題? ? 如果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è)過(guò)程不需要程序干涉。程序員需要完成的工作,是把最核心的啟動(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í)行剩下的程序。 ? ? 那么也就是說(shuō) 通常當(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中去(全考過(guò)去也行,方便點(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ù)都通過(guò)I/O口發(fā)送,管腳復(fù)用,這樣做的好處是,可以明顯減少NAND FLASH的管腳數(shù)目,將來(lái)如果設(shè)計(jì)者想將NAND FLASH更換為更高密度、更大容量的,也不必改動(dòng)電路板。 5.為什么NOR啟動(dòng)要將sp設(shè)置為0x40000000+4096
? ? 因?yàn)閷?duì)于啟動(dòng)文件.S來(lái)說(shuō),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ā),謝謝! |
|