學習嵌入式,最開始應該了解就是地址空間的分配,真正搞清楚每個地址代表的位置,才有了入門的基礎。
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的數據手冊可知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啟動流程
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硬件機制自動實現的,無需干預,第二次搬運需要程序員來實現,搬運程序量大小是系統的所有程序。
上一篇:關于S3C2440的地址分配的分析
下一篇:ARM地址重映射機制
推薦閱讀
史海拾趣