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