一.CPU 地址分配:
1. s3c2440A 的存儲器控制器有以下特性:
l 大小端(通過軟件選擇)
l 地址空間:每個bank有128M 的字節(總共1G字節/8個banks)
l 可編程的訪問位寬,bank0(16/32 位),其他bank(8/16/32 位)
l 共8個存儲器banks
l 6 個是ROM,SRAM 等類型存儲器bank (bank0 ---- bank5)
l 2 個是可以作為ROM、SRAM、SDRAM 等存儲器bank (bank6 ---- bank7)
l 7 個固定的存儲器bank起始地址 (bank0 ---- bank6)
l 最後一個bank 的起始地址可調整 (bank7, 接兩片sdram時.接在bank7上的sdram會根據bank6上的結束地址而調整)
l 最後兩個bank 大小可編程
l 所有存儲器bank的訪問周期可編程
l 總線訪問周期可通過插入外部wait來延長
l 支持SDRAM 的自刷新和掉電模式
理論上,cpu是32位的.可以尋址的空間為2的32次方,也就是4GB的地址空間.但我們cpu只用了其中一1GB多一點的空間,其它的空間都是未到到.且看下圖,我們作一個感性認識:
圖1
(1) S3C2440A的存儲器管理器提供訪問外部存儲器的所有控制信號,27位地址信號(ADDR[26:0])、32位數據信號(DATA[31:0])、8個片選信號(nGCS[7:0])、以及讀/寫控制信號等.
看圖1,我們知道.從0x4000 0000 地址開始,有片內SRAM,片內寄存器,還有未使用的空間.這是都是固定的,不能動的.留給我們用戶的只有0x0000 0000 到 0x3FFF FFFF這1GB的地址空間給我們用. 1GB的地址空間我們需要30根地址線才能完全尋址完畢,2 的 30次方 剛好等於1GB,但是,芯片引腳上只給出了27根地址()ADDR[26:0]),單靠芯片上的27根引腳,它只能控制128M的空間,那3根線去哪裡.其實這3根線用在了3-8譯碼器(如:000表示00000001,001表示00000010,010表示00000100,011表示00001000等等)的輸入端去了,而這個3-8譯碼器的輸出端,就是對應這nGCS0~7,對應著8個bank,用於選擇當前處於哪個bank,這樣做的好處在於很模塊化結構化了,便於管理.不會造成一片和手動去分割地址.
(2) bank0---bank5為固定128MB,bank6和bank7的容量可編程改變,可以是2、4、8、16、32、64、128MB
請看圖2
圖2
所以.7個固定存儲器bank(bank0-bank6)起始地址。bank7的開始地址與bank6的結束地址相連接,但是二者的容量必須相等,s3c2440最小可以支支持2MB(2MB一片,只接bank6) 最大支持是256MB(bank6接128MB,bank7接128MB),另需注意一點就是如果,需要接兩片sdram的話,兩片的容量大小必須是一樣的.看圖2就清楚了.
(3) bank0可以作為引導ROM。其數據線寬只能是16位和32位,其它存儲器的數據線寬可以是8位、16位和32位
(4) 地址:
0x0000 0000 ----- 0x3FFF FFFF : 分配了8個bank ,每個bank 有128MB尋址空間, 每個bank也都會有片選信號,這8個bank 的地址提供給nandflash ,norflash,sdram使用(下面sdram的接入我們會祥細講解)
0x4000 0000 ----- 0x47FF FFFF : 其中的前4KB空間,也就是0x4000 0000 到 0x4000 1000 為片內SRAM地址空間,這就是所謂的steppingstone(下面s3c2440啟動時會再討論steppingstone的作用),其它的空間未使用.
0x4800 0000 ----- 0x5FFF FFFF : 特殊功能寄存器,CPU的寄存器都在這時定義和配置.
0x6000 0000 ----- 0xFFFF FFFF : 這大概3G的空間是沒有使用的.