nandflash啟動理解

2021-06-10 00:46:42 字數 2163 閱讀 6446

有很多同學在移植u-boot時,都會對s3c2440從nand

flash啟動的過程非常迷惑。這裡發這個帖子給大家介紹一下它的啟動流程。

大部分arm9的cpu內部都整合有乙個sram,sram是英文static ram的縮寫,它是一種具有靜止訪問功能的記憶體,不需要重新整理電路即能儲存它內部儲存的資料。這樣他不需要初始化就能夠直接使用。這與我們在外部擴充套件的大容量的sdram是不一樣的,外部大容量的sdram是需要初始化後才能使用的,這點大家務必要搞清楚。這點在我做過移植的處理器:s3c2410(arm920t),s3c2440(arm920t),at91rm9200(arm920t),at91sam9260(arm926t)上都是這樣的。在s3c2440這顆cpu上這個sram大小為4kb,datasheet裡把它叫做stepping stone,江湖人稱「起步石」。

nandflash和norflash是不同的:norflash像記憶體一樣是直接掛在系統匯流排上的,這樣有足夠多的位址線使得cpu能夠定址到每乙個儲存單元上去,這也意味著cpu能夠直接通過匯流排訪問norflash上儲存的內容,同時他還支援xip(即片上執行,不用將**搬到記憶體中,直接在norflash上就能執行)。 而nandflash它並不是直接掛載系統匯流排上,而是通過nandflash控制器(這個一般整合在cpu內部)來完成讀寫操作的。如果我們把norflash的那種定址方式叫直接定址的話(不是彙編裡的那個直接定址,這裡指cpu能夠直接通過位址線訪問儲存器的儲存單元),那麼這裡的nandflash就是間接定址(這裡需要nandflash控制器來定址)。所以我們在使用nandflash之前,一定要初始化nandflash控制器。

理解上面的這點後,就不難理解,為什麼系統能夠從norflash直接啟動,而不能直接從nandflash啟動。這是因為,arm在cpu復位時,cpu缺省會到0x0000 0000位址處去取指令,而如果我們是從norflash啟動的話(一般norflash會掛到bank0,ngcs0上),s3c2440 cpu就會把norflash的空間掛接到0x0000 0000這段記憶體空間上。這時cpu就能夠直接從norflash上取指令執行,啟動了。而如果是nandflash, 因為nandflash他不能直接掛到系統匯流排上,並且他的讀寫,擦除操作必須依賴nandflash控制器,這也就意味著nandflash的儲存空間永遠不能對映到0x0000 0000這個位址上去。另外,nandflash的讀寫操作也不是這樣直接定址的,有興趣的同學可以自己看看nandlfash的datasheet,寫乙個raw的nandflash 擦除,讀寫操作程式就明白了。我就寫過這麼乙個程式,對理解nandflash究竟是怎麼操作的非常有幫助。

而如果這些cpu要從nandflash上啟動,那該怎麼辦呢?這就要用到我之前提到的cpu的內部sram了。

在s3c2440的datasheet裡有提到,如果我們配置從nandflash啟動的話,那麼cpu會自動將內部sram的位址對映到0x0000 0000這個位址空間上了,而如果不是從nandflash啟動,那麼掛載bank0(ngcs0)上的裝置就會被對映到0x0000 0000位址空間上,如我們之前提到的norflash。如下圖所示:

簡而言之就是:如果從nandflash啟動,那麼cpu內部sram被對映到0x0000 0000位址空間上,這時norflash就不可用了。而如果是從norflash啟動的話,那麼norflash被對映到0x0000 0000位址空間上。我們之前提到arm cpu在復位時,會預設到0x0000 0000位址上取指令。這樣也就是如果從nandflash啟動的話,那麼cpu缺省會從內部sram中取第一條指令;而如果從norflash啟動的話,那麼cpu預設從norflash中取第一條指令。

那如果從sram啟動的話,那麼sram中的指令(也就是**)從**來的呢?在s3c2440處理器(arm920t和arm926t的核應該都是這樣的,另外我看s3c6410也是如此)上電時,cpu會自動將nandflash的前4k**(或叫指令)拷貝到內部sram中,這是由cpu自動完成的,不需要我們干預。這也就意味著,sram中的內容就是我們nandflash上前4k的**了。

這樣,如果是在我們的bootloader如u-boot中就要確保,我們編譯出來的前4k**完成以下功能:

1, 初始化cpu,外部sdram,nandflash控制器等基本功能;

2, 將nandflash上剩餘的u-boot**拷貝到外部的sdram中

3, 調到外部的sdram中來執行u-boot**。

這樣,u-boot就啟動了。

nandflash的啟動原理

大部分arm9的cpu內部都整合有乙個sram,sram是英文static ram的縮寫,它是一種具有靜止訪問功能的記憶體,不需要重新整理電路即能儲存它內部儲存的資料。這樣他不需要初始化就能夠直接使用。這與我們在外部擴充套件的大容量的sdram是不一樣的,外部大容量的sdram是需要初始化後才能使用...

nand flash啟動和nor flash啟動

1 nor flash啟動 cpu看到的0位址是在nor flash上 1 把bootloader燒寫在nor flash的0位址 2 上電時,從nor flash的0位址開始執行。3 比較大時需重定位,重定位時,把 從nor flash 複製到sdram上的鏈結位址 程式執行時應該位於的地方 2 ...

nand flash和nor flash啟動區別

1 介面區別 nor flash位址線和資料線分開,來了位址和控制訊號,資料就出來。nand flash位址線和資料線在一起,需要用程式來控制,才能出資料。通俗的說,就是光給位址不行,要先命令,再給位址,才能讀到nand的資料。而且都是在乙個匯流排完成的。結論是 arm無法從nand直接啟動。除非裝...