S3C2440地址空間的分配及啟動過程
一、S3C2440地址空間的分配
1.s3c2440A的存儲器控制器有以下特性:
本文引用地址:http://m.butianyuan.cn/article/201611/317594.html大小端(通過軟件選擇)
l地址空間:每個bank有128M的字節(jié)(總共1G字節(jié)/8個banks)
l可編程的訪問位寬,bank0(16/32位),其他bank(8/16/32位)
l共8個存儲器banks
l6個是ROM,SRAM等類型存儲器bank
l2個是可以作為ROM、SRAM、SDRAM等存儲器bank
l7個固定的存儲器bank起始地址
l最后一個bank的起始地址可調整
l最后兩個bank大小可編程
l所有存儲器bank的訪問周期可編程
l總線訪問周期可通過插入外部wait來延長
l支持SDRAM的自刷新和掉電模式
2.尋址空間s3c2440是32位的,所以理論上可以尋址4GB空間,內存(SDRAM)和端口(特殊寄存器),還有ROM都映射到同一個4G空間里。但是,芯片引腳上只給出了27根地址(ADDR[26:0]),單靠芯片上的27根引腳,它只能控制128M的空間,剩下的在哪里?
在cpu芯片手冊上,查它的內部寄存器的地址,我們可以找到一部分答案。比如這次總結筆記要講的存儲器控制寄存器,13個寄存器,每個寄存器的地址,都大于0X4000 0000的地址。而0x4000 0000(1G)是1G空間的分界線,也就是說,1G~3G之間的空間,實際上都是被芯片自己占用了。實際上,給用戶的使用的空間,只有1G。
我們剛才說了,我們使用了128M,用了27根地址線。而1G空間,需要30根地址線。剩下的3根用在什么地方?查了資料,突然明白了。這三根被三星公司偷偷地用在了3-8譯碼器的輸入端去了。而這個3-8譯碼器的輸出端,就是對應這nGCS0~7,對應著8個bank。很明顯了,三星的2440留給用戶使用的這1G空間,27根線用于芯片引腳來控制具體的bank了,剩下的三根,用于選擇當前處于哪個bank。
二、S3C2440系統(tǒng)啟動
手冊里說,2440啟動方式?jīng)Q定于bank0,以及OM[1:0]。
Arm的啟動都是從0地址開始,所不同的是地址的映射不一樣。在arm開電的時候,要想讓arm知道以某種方式(地址映射方式)運行,不可能通過你寫的某段程序控制,因為這時候你的程序還沒啟動,這時候arm會通過引腳的電平來判斷。
S3C2440支持兩種啟動方式:NandFlash和非NandFlash(例NorFlash)啟動。
從NorFlash啟動時,與nGCS0相連的NorFlash就被映射到nGCS0片選的Bank0空間,其地址被映射為0x0000 0000;
從NandFlash啟動時,S3C2440芯片內部自帶的一塊容量為4K的被稱為“Steppingstone”(起步石)的BootRAM被映射到nGCS0片選的Bank0空間,其地址被映射為0x0000 0000。當系統(tǒng)上電或復位時,程序會從0x0地址處開始執(zhí)行,因此我們編寫的啟動代碼要確保存儲在0地址處。在實際的開發(fā)中,一般可以把bootloader燒入到Norflash,程序運行可以通過串口交互,進行一定的操作,比如下載,調試。這樣就很可以很方便的調試你的一些代碼。Norflash中的Bootloader還可以燒錄內核到Norflash等等功能。
NorFlash啟動時,沒有額外需要考慮的問題,因為這種情況下程序在系統(tǒng)啟動前就存儲在NorFlash中,我們只要保證將啟動代碼保存在NorFlash開始的位置即可,系統(tǒng)上電或復位時,0地址處的啟動代碼就會被執(zhí)行。
NandFlash啟動時,系統(tǒng)啟動前所有的程序存儲在NandFlash中,系統(tǒng)的啟動過程稍微有點復雜:系統(tǒng)上電或復位時,0地址處為S3C2440內部自帶的BootSRAM,啟動前里面沒有任何存儲內容,啟動后S3C2440先通過硬件機制將NandFlash前4k的內容拷貝到BootSRAM中,然后再運行里面的程序(從0地址處開始)。這種情況下我們需要保證將啟動代碼保存在NandFlash開始的位置,并且啟動代碼的大小要小于4K。
如果系統(tǒng)的所有程序在編譯鏈接后的大小小于4K,那在系統(tǒng)的啟動代碼中無需考慮將程序從NandFlash搬運到SDRAM這個問題,因為所有的程序在啟動時即全部由NandFlash拷貝至BootSRAM,程序在BootSRAM中運行即可;如果系統(tǒng)的所有程序在編譯鏈接后的大小大于4K,那在系統(tǒng)的啟動代碼中就需要包含一段將系統(tǒng)的全部程序從NandFlash搬運到SDRAM的代碼,因為系統(tǒng)啟動時只將NandFlash的前4K拷貝到了BootSRAM中,還有部分程序在NandFlash中,而程序在NandFlash中是無法運行的,需要將所有程序拷貝至SDRAM并在其中運行,所以系統(tǒng)的啟動代碼中要包含這段有關程序拷貝的代碼,并在所有程序拷貝完成后使程序跳轉到SDRAM中運行。也就是說NandFlash啟動時需要考慮到涉及的兩次搬移,第一次搬運是S3C2440硬件機制自動實現(xiàn)的,無需干預,第二次搬運需要程序員來實現(xiàn),搬運程序量大小是系統(tǒng)的所有程序。
評論