新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > arm nandflash&norflash啟動(dòng)原理

arm nandflash&norflash啟動(dòng)原理

作者: 時(shí)間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
部分ARM9的CPU內(nèi)部都集成有一個(gè)SRAM,SRAM是英文Static RAM的縮寫,它是一種具有靜止存取功能的內(nèi)存,不需要刷新電路即能保存它內(nèi)部存儲(chǔ)的數(shù)據(jù)。這樣他不需要初始化就能夠直接使用。這與我們?cè)谕獠繑U(kuò)展的大容量的SDRAM是不一樣的,外部大容量的SDRAM是需要初始化后才能使用的,這點(diǎn)大家務(wù)必要搞清楚。這點(diǎn)在我做過移植的處理器:s3c2410(arm920t),s3c2440(arm920t),at91rm9200(arm920t),at91sam9260(arm926t)上都是這樣的。在s3c2440這顆CPU上這個(gè)SRAM大小為4KB,datasheet里把它叫做Stepping Stone,江湖人稱“起步石”。
Nandflash和Norflash是不同的:Norflash像內(nèi)存一樣是直接掛在系統(tǒng)總線上的,這樣有足夠多的地址線使得CPU能夠?qū)ぶ返矫恳粋€(gè)存儲(chǔ)單元上去,這也意味著CPU能夠直接通過總線訪問Norflash上存儲(chǔ)的內(nèi)容,同時(shí)他還支持XIP(即片上執(zhí)行,不用將代碼搬到內(nèi)存中,直接在Norflash上就能運(yùn)行)。而Nandflash它并不是直接掛載系統(tǒng)總線上,而是通過Nandflash控制器(這個(gè)一般集成在CPU內(nèi)部)來完成讀寫操作的。如果我們把Norflash的那種尋址方式叫直接尋址的話(不是匯編里的那個(gè)直接尋址,這里指CPU能夠直接通過地址線訪問存儲(chǔ)器的存儲(chǔ)單元),那么這里的Nandflash就是間接尋址(這里需要Nandflash控制器來尋址)。所以我們?cè)谑褂肗andflash之前,一定要初始化Nandflash控制器。
理解上面的這點(diǎn)后,就不難理解,為什么系統(tǒng)能夠從Norflash直接啟動(dòng),而不能直接從Nandflash啟動(dòng)。這是因?yàn)椋珹RM在CPU復(fù)位時(shí),CPU默認(rèn)會(huì)到0x0000 0000地址處去取指令,而如果我們是從Norflash啟動(dòng)的話(一般Norflash會(huì)掛到Bank0,nGCS0上),s3c2440 CPU就會(huì)把Norflash的空間掛接到0x0000 0000這段內(nèi)存空間上。這時(shí)CPU就能夠直接從Norflash上取指令運(yùn)行,啟動(dòng)了。而如果是Nandflash,因?yàn)镹andflash他不能直接掛到系統(tǒng)總線上,并且他的讀寫,擦除操作必須依賴Nandflash控制器,這也就意味著Nandflash的存儲(chǔ)空間永遠(yuǎn)不能映射到0x0000 0000這個(gè)地址上去。另外,Nandflash的讀寫操作也不是這樣直接尋址的,有興趣的同學(xué)可以自己看看Nandlfash的datasheet,寫一個(gè)RAW的Nandflash 擦除,讀寫操作程序就明白了。我就寫過這么一個(gè)程序,對(duì)理解Nandflash究竟是怎么操作的非常有幫助。
而如果這些CPU要從Nandflash上啟動(dòng),那該怎么辦呢?這就要用到我之前提到的CPU的內(nèi)部SRAM了。
在S3C2440的datasheet里有提到,如果我們配置從Nandflash啟動(dòng)的話,那么CPU會(huì)自動(dòng)將內(nèi)部SRAM的地址映射到0x0000 0000這個(gè)地址空間上了,而如果不是從Nandflash啟動(dòng),那么掛載Bank0(nGCS0)上的設(shè)備就會(huì)被映射到0x0000 0000地址空間上,如我們之前提到的Norflash。
簡而言之就是:如果從Nandflash啟動(dòng),那么CPU內(nèi)部SRAM被映射到0x0000 0000地址空間上,這時(shí)Norflash就不可用了。而如果是從Norflash啟動(dòng)的話,那么Norflash被映射到0x0000 0000地址空間上。我們之前提到ARM CPU在復(fù)位時(shí),會(huì)默認(rèn)到0x0000 0000地址上取指令。這樣也就是如果從Nandflash啟動(dòng)的話,那么CPU默認(rèn)會(huì)從內(nèi)部SRAM中取第一條指令;而如果從Norflash啟動(dòng)的話,那么CPU默認(rèn)從Norflash中取第一條指令。
那如果從SRAM啟動(dòng)的話,那么SRAM中的指令(也就是代碼)從哪里來的呢?在s3c2440處理器(arm920t和arm926t的核應(yīng)該都是這樣的,另外我看S3C6410也是如此)上電時(shí),CPU會(huì)自動(dòng)將Nandflash的前4K代碼(或叫指令)拷貝到內(nèi)部SRAM中,這是由CPU自動(dòng)完成的,不需要我們干預(yù)。這也就意味著,SRAM中的內(nèi)容就是我們Nandflash上前4K的代碼了。
這樣,如果是在我們的bootloader如u-boot中就要確保,我們編譯出來的前4K代碼完成以下功能:
1, 初始化CPU,外部SDRAM,Nandflash控制器等基本功能;
2, 將Nandflash上剩余的u-boot代碼拷貝到外部的SDRAM中
3, 調(diào)到外部的SDRAM中來運(yùn)行u-boot代碼。
這樣,U-boot就啟動(dòng)了。


評(píng)論


技術(shù)專區(qū)

關(guān)閉