1. 程式人生 > >關於S3C2440儲存器地址分配和啟動流程分析

關於S3C2440儲存器地址分配和啟動流程分析

學習嵌入式,最開始應該瞭解就是地址空間的分配,真正搞清楚每個地址代表的位置,才有了入門的基礎。

1、地址分配(27根線如何尋找1G空間)

S3C2440集成了豐富了外設控制器(LCD控制器、USB Device控制器、USB Host控制器、NAND FLASH控制器、I2C控制器、SPI控制器等)。要控制這些外設就要設定相應控制器的暫存器以產生相應的驅動時序。學習S3C2440,主要是如何配置暫存器。

下面是S3C2440特殊功能暫存器地址:
#define rBANKCON0  (*(volatileunsigned *)0x48000004) //Boot ROM control
#define rBANKCON1  (*(volatileunsigned *)0x48000008) //BANK1 control
#define rBANKCON2  (*(volatileunsigned *)0x4800000c) //BANK2 cControl

在學習的過程我一直在想這些地址為什麼是這樣的?

arm體系並沒有明確指明每個暫存器的地址,而是各個晶片廠家自己設定了每個特殊暫存器的地址。

查的資料手冊可知S3C2440可定址1G的地址範圍,但是S3C2440的地址線只有27根,理論上只能定址2的27次方等於128M的地址範圍。
通過細緻的分析可知:S3C2440通過一個BANK來解決了這個問題。

S3C2440有8個儲存器BANK,引出了8根BANK線(對應nGCS0~ nGCS7),通過這個8根線來選通和關閉不同的儲存器,這樣S3C2440最多就可以連線8個128M的儲存器。對某個BANK地址的訪問實際上就是選通該BANK,於是ARM核只要發出一個地址,然後S3C2440的儲存控制器把該地址解釋成兩部分:一部分是BANK地址,一部分是連線到該BANK儲存器內部的地址就可以訪問了。

這8個儲存器banks:

6 個是ROM,SRAM 等型別儲存器bank (bank0 ---- bank5)
l2 個是可以作為ROM、SRAM、SDRAM 等儲存器bank (bank6 ---- bank7)
l7 個固定的儲存器bank起始地址 (bank0 ---- bank6)
l最後一個bank 的起始地址可調整 (bank7, 接兩片sdram時.接在bank7上的sdram會根據bank6上的結束地址而調整)

而作為32位的CPU,理論上可以使用的地址範圍可以達到2的32次方等於4G,除去上述的1G地址空間,還有一部分是CPU內部暫存器的地址,剩下的地址空間沒有使用。


圖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的空間是沒有使用的.

下面的圖片或許更加直觀:

1、綠色那部分為外設地址空間,大小為1G,存在於CPU外部,由於存放資料與程式用的,CPU可通過地址線和資料線從中讀取資料。
2、黃色那部分為功能部件暫存器,大小為3G,存在於CPU內部,即在這些暫存器上寫入一些資料,則可控制相應功能部件的行為。


其中的各功能部件的暫存器地址範圍如表下:


其中的各外設的訪問地址如下表:


2、S3C2440啟動流程

支援兩種啟動模式:NAND和非NAND(這裡是nor flash)。具體採用的方式取決於OM0、OM1兩個引腳
OM[1:0所決定的啟動方式
OM[1:0]=00時,處理器從NAND Flash啟動
OM[1:0]=01時,處理器從16位寬度的ROM啟動
OM[1:0]=10時,處理器從32位寬度的ROM啟動。
OM[1:0]=11時,處理器從Test Mode啟動。


1當引腳OM0跟OM1有一個是高電平時,這時地址0會對映到外部nGCS0片選的空間,也就是Norflash,程式就會從Norflash中啟動,arm直接取Norflash中的指令執行。2當OM0跟OM1都為低電平,則0地址內部bootbuf(一段4k的SRAM)開始。系統上電,arm會自動把NANDflash中的前4K內容考到bootbuf(也就是0地址),然後從0地址執行。
Arm的啟動都是從0地址開始,所不同的是地址的對映不一樣。在arm開電的時候,要想讓arm知道以某種方式(地址對映方式)執行,不可能通過你寫的某段程式控制,因為這時候你的程式還沒啟動,這時候arm會通過引腳的電平來判斷。


1) 從NorFlash啟動時,與nGCS0相連的NorFlash就被對映到nGCS0片選的Bank0空間,其地址被對映為0x0000 0000;http://blog.csdn.net/shanzhizi


2) 從NandFlash啟動時,S3C2440晶片內部自帶的一塊容量為4K的被稱為“Steppingstone”(起步石)的BootRAM被對映到nGCS0片選的Bank0空間,其地址被對映為0x0000 0000。當系統上電或復位時,程式會從0x0地址處開始執行,因此我們編寫的啟動程式碼要確保儲存在0地址處。如果系統的所有程式在編譯連結後的大小小於4K,那在系統的啟動程式碼中無需考慮將程式從NandFlash搬運到SDRAM這個問題,因為所有的程式在啟動時即全部由NandFlash拷貝至BootSRAM,程式在BootSRAM中執行即可;如果系統的所有程式在編譯連結後的大小大於4K,那在系統的啟動程式碼中就需要包含一段將系統的全部程式從NandFlash搬運到SDRAM的程式碼,因為系統啟動時只將NandFlash的前4K拷貝到了BootSRAM中,還有部分程式在NandFlash中,而程式在NandFlash中是無法執行的,需要將所有程式拷貝至SDRAM並在其中執行,所以系統的啟動程式碼中要包含這段有關程式拷貝的程式碼,並在所有程式拷貝完成後使程式跳轉到SDRAM中執行。也就是說NandFlash啟動時需要考慮到涉及的兩次搬移,第一次搬運是S3C2440硬體機制自動實現的,無需干預,第二次搬運需要程式設計師來實現,搬運程式量大小是系統的所有程式。

點選檢視更多嵌入式文章。

文章參考:http://www.linuxidc.com/Linux/2011-11/46479.htm