網(wǎng)站推廣網(wǎng)電商網(wǎng)站對(duì)比
轉(zhuǎn)自--https://blog.csdn.net/eastonwoo/article/details/8767608?對(duì)一些自己感覺比較難以理解的地方額外做了注解與修改,并新增了一些內(nèi)容
一.CPU 地址分配:
1.???s3c2440A 的存儲(chǔ)器控制器有以下特性:
- 大小端(通過軟件選擇)
- 地址空間:每個(gè)bank有128M 的字節(jié)(總共1G字節(jié)/8個(gè)banks)
- 可編程的訪問位寬,bank0(16/32 位),其他bank(8/16/32 位)
- 共8個(gè)存儲(chǔ)器banks
- 6 個(gè)是ROM,SRAM 等類型存儲(chǔ)器bank???(bank0 ---- bank5)
- 2 個(gè)是可以作為ROM、SRAM、SDRAM 等存儲(chǔ)器bank???(bank6 ---- bank7)
- 7 個(gè)固定的存儲(chǔ)器bank起始地址???(bank0 ---- bank6)
- 最后一個(gè)bank 的起始地址可調(diào)整???(bank7, 接兩片sdram時(shí).接在bank7上的sdram會(huì)根據(jù)bank6上的結(jié)束地址而調(diào)整)
- 最后兩個(gè)bank 大小可編程
- 所有存儲(chǔ)器bank的訪問周期可編程
- 總線訪問周期可通過插入外部wait來延長(zhǎng)
- 支持SDRAM 的自刷新和掉電模式
?
理論上,cpu是32位的.可以尋址的空間為2的32次方,也就是4GB的地址空間.但我們cpu只用了其中一1GB多一點(diǎn)的空間,其它的空間都是未到到.且看下圖,我們作一個(gè)感性認(rèn)識(shí):
????????????????????????????????????????????????圖1
(1) S3C2440A的存儲(chǔ)器管理器提供訪問外部存儲(chǔ)器的所有控制信號(hào),27位地址信號(hào)(ADDR[26:0])、32位數(shù)據(jù)信號(hào)(DATA[31:0])、8個(gè)片選信號(hào)(nGCS[7:0])、以及讀/寫控制信號(hào)等.
看圖1,我們知道.從0x4000 0000 地址開始,有片內(nèi)SRAM,片內(nèi)寄存器,還有未使用的空間.這是都是固定的,不能動(dòng)的.留給我們用戶的只有0x0000 0000?到 0x3FFF FFFF這1GB的地址空間給我們用.?1GB的地址空間我們需要30根地址線才能完全尋址完畢,2 的 30次方 剛好等于1GB,但是,芯片引腳上只給出了27根地址()ADDR[26:0]),單靠芯片上的27根引腳,它只能控制128M的空間,那3根線去哪里.其實(shí)這3根線用在了3-8譯碼器(如:000表示00000001,001表示00000010,010表示00000100,011表示00001000等等)的輸入端去了,而這個(gè)3-8譯碼器的輸出端,就是對(duì)應(yīng)這nGCS0~7,對(duì)應(yīng)著8個(gè)bank,用于選擇當(dāng)前處于哪個(gè)bank,這樣做的好處在于很模塊化結(jié)構(gòu)化了,便于管理.不會(huì)造成一片和手動(dòng)去分割地址.
(2) bank0---bank5為固定128MB,bank6和bank7的容量可編程改變,可以是2、4、8、16、32、64、128MB
請(qǐng)看圖2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2
圖內(nèi)確定了bank6-bank7在不同容量時(shí)的起始地址。bank7的開始地址與bank6的結(jié)束地址相連接,但是二者的容量必須相等,s3c2440最小可以支支持2MB(2MB一片,只接bank6) 最大支持是256MB(bank6接128MB,bank7接128MB),另需注意一點(diǎn)就是如果,需要接兩片sdram的話,兩片的容量大小必須是一樣的.看圖2就清楚了.
(3) bank0可以作為引導(dǎo)ROM。其數(shù)據(jù)線寬只能是16位和32位,其它存儲(chǔ)器的數(shù)據(jù)線寬可以是8位、16位和32位
(4) 地址:
0x0000 0000 ----- 0x3FFF FFFF?:?分配了8個(gè)bank ,每個(gè)bank?有128MB尋址空間,?每個(gè)bank也都會(huì)有片選信號(hào),這8個(gè)bank 的地址提供給nandflash ,norflash,sdram使用(下面sdram的接入我們會(huì)祥細(xì)講解)
0x4000 0000 ----- 0x47FF FFFF : 其中的前4KB空間,也就是0x4000 0000 到 0x4000 1000 為片內(nèi)SRAM地址空間,這就是所謂的steppingstone(下面s3c2440啟動(dòng)時(shí)會(huì)再討論steppingstone的作用),其它的空間未使用.
0x4800 0000 ----- 0x5FFF FFFF : 特殊功能寄存器,CPU的寄存器都在這時(shí)定義和配置.
0x6000 0000 ----- 0xFFFF FFFF : 這大概3G的空間是沒有使用的.
?
二.s3c2440接線規(guī)則:
?????????????????????????????????????????????????圖3
1) SDRAM接法規(guī)則,分三步(以K4S561632E為例):
1-1).需得到邏輯bank的選擇IO:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖4-1
?????????????????????????????????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖4-2
Bank Size: 外接內(nèi)存容量大小(K4S561632E是4M*16bit*4Bank*2Chips/8=64MB)
Bus Width: 總線寬度 (兩片16位K4S561632E,并聯(lián)成32位)
Base Component:單個(gè)芯片容量(bit)(256Mb)
Memory Configration:內(nèi)存配置 ((4M*16*4banks)*2Chips )
根據(jù)K4S561632E的規(guī)格書(如圖4-1,圖4-2)得到一些信息.再結(jié)合圖3 ,我們可以得到邏輯bank的選擇I/O A[25:24](地址線的第24,25腳需接芯片的BA0,BA1)
1-2).需要得到芯片的開始pin 號(hào):
???????????????????????????????????????????????????????圖5
我們選擇了兩片的K4S561632E sdram,所以是32位的.從A2(cpu地址先ADDR2需接到SDRAM的A0上)開始,?
s3c2440的ADDR2???-------------???K4S561632E 的A0
s3c2440的ADDR3???-------------???K4S561632E 的A1
如此類推...
為什么要從ADD2開始了.我們知道SDRAM的尋址原理是一個(gè)存儲(chǔ)陣列,如圖6:
??????????????????????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖6
每一片的K4S561632E 有4個(gè)邏輯bank,每個(gè)bank有4M個(gè)存儲(chǔ)單元,每個(gè)存儲(chǔ)單元有16位.這就是規(guī)格書所說的 4M*16bit*4Bank = 256Mbit.
而2片K4S561632E就有4M*4Bank*32bit = 512Mbit = 64MB,(市面上很少有32位寬的單片SDRAM,一般選擇2片16位SDRAM擴(kuò)展到32位寬)
內(nèi)存尋址一次,就是行(ROW)列(Column)交叉一次,得到一個(gè)存儲(chǔ)單元,也就是說內(nèi)存是以"存儲(chǔ)單元(本例為4個(gè)字節(jié),低16位與高16位合成一個(gè)存儲(chǔ)單元)"為單位的,而不是以"字節(jié)"為單位的.但是,cpu尋址是以字節(jié)為單位的.也就是說,cpu移動(dòng)到下一個(gè)才一個(gè)字節(jié),而本例內(nèi)存移動(dòng)到下一個(gè)就是4個(gè)字節(jié),所以我們寫程序時(shí)常常說要字節(jié)對(duì)齊就是這個(gè)原因(所以是不是能單字節(jié)尋址的就不需要字節(jié)對(duì)齊?)。下面我舉例子具體說明一下:
cpu 尋址內(nèi)存?????內(nèi)存返回給cpu
0000 0000??????????第0個(gè)單元(其實(shí)包含0000 0000?至 0000 0011??這4個(gè)字節(jié))
0000 0100??????????第1個(gè)單元(其實(shí)包含0000 0100?至 0000 0111??這4個(gè)字節(jié))
0000 0101??????????第1個(gè)單元(其實(shí)包含0000 0100?至 0000 0111??這4個(gè)字節(jié))??因?yàn)閟3c2440沒接A1和A0,所以相于邏輯與0xFFFF FF00,取到內(nèi)存的4個(gè)字節(jié)后再用低兩位去選擇
0000 1100??????????第3個(gè)單元(其實(shí)包含0000 1100?至 0000 1111??這4個(gè)字節(jié))?
如此類推.....
cpu 的第2位對(duì)應(yīng)了內(nèi)存的第0位.也就是說cpu的4,而內(nèi)存看成是1,他們的單位不同而已,一個(gè)是字節(jié),一個(gè)是存儲(chǔ)單位,也就是位寬.
同理,16位的位寬SDRAM的A0應(yīng)該接到s3c2440的ADDR1上.
結(jié)論:SDRAM的A0接到s3c2440的那一個(gè)引腳上是根據(jù)整個(gè)SDRAM的位寬決定的.
1-3).開始連接SDRAM到s3c2440:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???圖7
2) norflash接法規(guī)則,以EN29LV160A為例.
這個(gè)IC 位寬是通過引腳號(hào)為47的高低電平來選擇BYTE/WORD,也就是有8位,16位兩種模式.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖8
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖9
規(guī)則大同小異,我這里就不多說了.
?
3)NANDFLASH接法規(guī)則,以K9FXX08為例:
三.s3c2440系統(tǒng)啟動(dòng):
s3c2440支持兩種啟動(dòng)模式:NAND和非NAND(這里是nor flash)。
具體采用的方式取決于OM0、OM1兩個(gè)引腳
OM[1:0]所決定的啟動(dòng)方式
OM[1:0]=00時(shí),處理器從NAND Flash啟動(dòng)
OM[1:0]=01時(shí),處理器從16位寬度的ROM啟動(dòng)
OM[1:0]=10時(shí),處理器從32位寬度的ROM啟動(dòng)。
OM[1:0]=11時(shí),處理器從Test Mode啟動(dòng)。
1當(dāng)引腳OM0跟OM1有一個(gè)是高電平時(shí),這時(shí)地址0會(huì)映射到外部nGCS0片選的空間,也就是Norflash,程序就會(huì)從Norflash中啟動(dòng),arm直接取Norflash中的指令運(yùn)行。
2當(dāng)OM0跟OM1都為低電平,則0地址內(nèi)部bootbuf(一段4k的SRAM)開始。系統(tǒng)上電,arm會(huì)自動(dòng)把NANDflash中的前4K內(nèi)容考到bootbuf(也就是0地址),然后從0地址運(yùn)行。
原理圖內(nèi)關(guān)于OM0和OM1的接法如下: OM1由一個(gè)開關(guān)控制,OM1直接接地。
?
?
Arm的啟動(dòng)都是從0地址開始,所不同的是地址的映射不一樣。在arm開電的時(shí)候,要想讓arm知道以某種方式(地址映射方式)運(yùn)行,不可能通過你寫的某段程序控制,因?yàn)檫@時(shí)候你的程序還沒啟動(dòng),這時(shí)候arm會(huì)通過引腳的電平來判斷。
1) 從NorFlash啟動(dòng)時(shí),與nGCS0相連的NorFlash就被映射到nGCS0片選的Bank0空間,其地址被映射為0x0000 0000;
2) 從NandFlash啟動(dòng)時(shí),S3C2440芯片內(nèi)部自帶的一塊容量為4K的被稱為“Steppingstone”(起步石)的BootRAM被映射到nGCS0片選的Bank0空間,其地址被映射為0x0000 0000。當(dāng)系統(tǒng)上電或復(fù)位時(shí),程序會(huì)從0x0地址處開始執(zhí)行,因此我們編寫的啟動(dòng)代碼要確保存儲(chǔ)在0地址處(所以燒錄u-boot時(shí),都需要燒錄在0地址上)。
如果系統(tǒng)的所有程序在編譯鏈接后的大小小于4K,那在系統(tǒng)的啟動(dòng)代碼中無(wú)需考慮將程序從NandFlash搬運(yùn)到SDRAM這個(gè)問題,因?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)行。也就是說NandFlash啟動(dòng)時(shí)需要考慮到涉及的兩次搬移,第一次搬運(yùn)是S3C2440硬件機(jī)制自動(dòng)實(shí)現(xiàn)的,無(wú)需干預(yù),第二次搬運(yùn)需要程序員來實(shí)現(xiàn),搬運(yùn)程序量大小是系統(tǒng)的所有程序。
?
?
NANDFLASH啟動(dòng)流程如圖所示:
————————————————
版權(quán)聲明:本文為CSDN博主「EastonWoo」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/eastonwoo/article/details/8767608