S3C2440A地址空間



  首先,說明如下:

ARM按字節尋址,即對存儲的最小訪問單元是字節;存儲單元按字節對齊。

地址空間從高到底分爲兩部分:主存儲區(包括靜態存儲區(存放img)和動態存儲區(就是我們通常說的運行代碼的內存))和外設寄存器區。

而主存儲區又會分爲很多bank,目的是爲了讓更少的地址總線尋址更多的地址(128MB*8 = 1GB)即片選+地址總線模式。

研究啓動過程關心的是主存儲區的靜態存儲區;還有ARM核0x0000 0000處的映射(可能是主存儲區的靜態存儲區(一般是bank0處的nor flash),也可能是核內SRAM(4KB)(nand flash啓動時就是這種);由OM[4:0]設置)。

開發外設驅動,我們關心外設寄存器區的地址空間。下面的講解也都是基於以上分析。

==================================================================================================================================== 

  一、整體圖如下:其中白色部分爲ARM核內部的寄存器(訪問他們,只能使用匯編語言。ARM核=ALU + CU + R + 內部總線);他們通過ALU總線、PC總線、A總線、B總線、增量器總線等與運算器和控制器連接在一起。該部分沒有被編入我們通常所說的地址空間、即32位地址之中;通過邏輯電路直接給出操作地址。

    其他爲ARM核外空間、他們都掛在AMBA總線上,總共32位(而ARM對存儲的訪問是按字節的,即地址每挪動一位、傳送1字節數據)、即4GB。其中綠色部分爲所接外部存儲器地址空間(不包括NAND Flash)、0x0000 0000~0x 4000 0000、是由27根地址總線(128M尋址)和8個片選位(BANK)組成黃色部分是外設寄存器地址空間、即0x4000 0000~0xFFFF FFFF,這部分也是我們編寫BSP、外設驅動時所需要經常使用的地址;紅色部分是外設。

    

    二、S3C2440A的ARM核內有31個通用寄存器和6個程序狀態寄存器,如白色部分該部分沒有被編入我們通常所說的地址空間、即32位地址之中;通過邏輯電路直接給出操作地址)。

     

      這些寄存器只有通過彙編語言纔可以訪問;訪問時,直接使用他們的名字即可。

    三、S3C2440A的ARM核外空間地址分配,即32位地址空間(0x0000 0000~0xFFFF FFFF)的所有地址分析

      S3C2440A是32位的(地址總線),2的32次方得知該CPU的地址空間爲4GB(ARM按字節尋址),即該CPU可訪問4GB大小的範圍。


      1.上圖綠色部分爲外部存儲器地址空間,0x0000 0000~0x4000 0000、大小爲1GB、是由27根地址總線(128MB尋址)和8個片選位(BANK)組成;包括SROM(NOR Flash)、SDRAM(靜態內存)和SRAM(4KB內存),不包括NAND Flash。存在於S3C2440A外部,用於存放數據和程序用的,S3C2440A可通過地址線和數據線從中讀取數據。

      S3C2440A外部存儲設備的訪問地址:


      2.最上圖黃色部分爲功能部件寄存器(也叫特殊功能寄存器),0x4000 0000~0xFFFF FFFF、大小3GB;包括存儲器控制寄存器、NAND Flash控制器(掛NAND Flash)、中斷控制器、IIS控制器、AC97音頻編解碼接口、IIC控制器、NAND Flash控制器、LCD控制器等等。存在於S3C2440A內部,即在這些寄存器上寫入一些數據,則可控制相應功能部件的行爲。這部分也是我們編寫BSP、外設驅動時所需要經常使用的地址。 

    S3C2440A內部各功能部件的寄存器(也叫特殊功能寄存器)地址:這部分也是我們編寫BSP、外設驅動時所需要經常使用的地址)

      

====================================================================================================================================

====================================================================================================================================

====================================================================================================================================

    四、系統從NOR Flash的啓動過程比較簡單;下面重點從NAND Flash的啓析來分析整個過程,涉及S3C2440A外部存儲設備的地址(即0x0000 0000~0x4000 0000這1G空間)分配問題:

如下圖兩種模式是通過硬件拉高拉低電平設置OM[4:0]位決定的!

    

1. 系統是不能從NAND直接啓動的(可以從NOR直接啓動),必須把程序讀入內存才能運行。把boot loader程序放在NAND Flash的前4kb空間,2440啓動後會自動把前4kb的boot程序讀入內存SRAM、並通過OM[4:0]把該段SRAM映射進nGDS0(注意這個和BANK片選的區別!)運行,這個過程是自動完成的。

2. 要通過J-Flash ARM燒錄NAND Flash,地址須設置爲0x3200 0000,這不是SDRAM的地址嗎?燒寫NAND Flash的過程也必須是先把data寫進內存,再由內存燒寫進NAND Flash,所以地址要寫成內存的地址。

    Linux內存分爲內核區(內核專用);高速緩存區(爲磁盤或軟盤交換數據準備的);用戶申請區(這纔是我們常說的內存)。而硬盤的讀寫必須經過內存的高速緩存區才能傳輸。

    由於NAND FLASH是接在NAND FLASH控制器上而不是系統總線上,所以沒有在S3C2440A的8個BANK中分配地址空間。如果S3C2440被配置成從Nand Flash啓動,在S3C2440上電後,Nand Flash控制器的會自動的把Nand Flash上的前4K數據搬移到內部SRAM中,也就是所謂的”Steppingstone”, 同時把這段片內SRAM映射(OM[4:0]設置,注意跟片選bank沒有任何關係!)到nGCS0(即0x0000 0000)。系統會從這個內部SRAM中啓動,程序員需要完成的工作,就是把最核心的啓動程序放在Nand Flash的前4KB中,也就是說,你需要編寫一個長度小於4KB的引導程序,作用是將主程序拷貝到RAM (一般是SDRAM)中運行。而在Nand Flash方式啓動的情況下,系統是”看不到”Nor Flash的,因爲Nor Flash也是掛在nGCS0上的,而nGCS0的地址空間已經被佔用了。

====================================================================================================================================

    移植u-boot時,s3c2440從Nandflash啓動的過程:

    大部分ARM9的CPU內部都集成有一個SRAM,SRAM是英文Static RAM的縮寫,它是一種具有靜止存取功能的內存,不需要刷新電路即能保存它內部存儲的數據。這樣他不需要初始化就能夠直接使用。這與我們在外部擴展的大容量的SDRAM是不一樣的,外部大容量的SDRAM是需要初始化後才能使用的。在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 擦除,讀寫操作程序就明白了。

    而如果這些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的代碼了。


這樣,如果是從NAND Flash啓動、在我們的bootloader如u-boot中就要確保編譯出來的前4K代碼完成以下功能:

1, 初始化CPU,外部SDRAM,Nandflash控制器等基本功能;

2, 將Nandflash上剩餘的u-boot代碼拷貝到外部的SDRAM中;

3, 調到外部的SDRAM中來運行u-boot代碼。

這樣,U-boot就啓動了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章