nandflash啓動理解

有很多同學在移植u-boot時,都會對s3c2440從Nandflash啓動的過程非常迷惑。這裏發這個帖子給大家介紹一下它的啓動流程。

   大部分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就啓動了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章